From 7433ab8f20c762d62fb505cb2316dbb60047fa66 Mon Sep 17 00:00:00 2001
From: pme <pme@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Mon, 16 Sep 2002 18:58:48 +0000
Subject: 2002-09-16  Phil Edwards  <pme@gcc.gnu.org>

	* testsuite/abi_check.cc:  Pull shell fragments out into...
	* config/abi/extract_symvers:  ...here.  New file.
	* Makefile.am (check_abi):  Change to match.
	(new-abi-baseline):  New target.
	* Makefile.in:  Regenerated.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@57208 138bc75d-0d04-0410-961f-82ee72b054a4
---
 libstdc++-v3/ChangeLog                  |  8 ++++
 libstdc++-v3/Makefile.am                | 17 ++++++++-
 libstdc++-v3/Makefile.in                | 60 ++++++++++--------------------
 libstdc++-v3/config/abi/extract_symvers | 64 ++++++++++++++++++++++++++++++++
 libstdc++-v3/testsuite/abi_check.cc     | 66 ++++++++++++---------------------
 5 files changed, 130 insertions(+), 85 deletions(-)
 create mode 100755 libstdc++-v3/config/abi/extract_symvers

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 113a0df6bd0..0d8f5c35f3e 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+2002-09-16  Phil Edwards  <pme@gcc.gnu.org>
+
+	* testsuite/abi_check.cc:  Pull shell fragments out into...
+	* config/abi/extract_symvers:  ...here.  New file.
+	* Makefile.am (check_abi):  Change to match.
+	(new-abi-baseline):  New target.
+	* Makefile.in:  Regenerated.
+
 2002-09-16  Richard Henderson  <rth@redhat.com>
 
 	* include/std/std_limits.h (__glibcpp_f32_denorm_min_bytes,
diff --git a/libstdc++-v3/Makefile.am b/libstdc++-v3/Makefile.am
index e3822dcc901..410aa5549a7 100644
--- a/libstdc++-v3/Makefile.am
+++ b/libstdc++-v3/Makefile.am
@@ -46,10 +46,25 @@ check-script-install: $(top_builddir)/mkcheck
 	  cd testsuite; \
 	  @glibcpp_builddir@/mkcheck 1)
 
+# Use 'new-abi-baseline' to create an initial symbol file.  Then run
+# 'check-abi' to test for changes against that file.
 baseline_file = @baseline_file@
 check-abi: $(top_builddir)/testsuite/abi_check
 	-(cd testsuite; \
-	  ./abi_check ${baseline_file})
+	  ${top_srcdir}/config/abi/extract_symvers \
+	     ../src/.libs/libstdc++.so \
+	     ./current_symbols.txt && \
+	  ./abi_check --check ./current_symbols.txt ${baseline_file})
+
+new-abi-baseline:
+	-@(output=${baseline_file}; \
+	  if test -f $${output}; then \
+	    output=$${output}.new; \
+	    t=`echo $${output} | sed 's=.*config/abi/=='`; \
+	    echo "Baseline file already exists, writing to $${t} instead."; \
+	  fi; \
+	  ${top_srcdir}/config/abi/extract_symvers \
+	     src/.libs/libstdc++.so $${output})
 
 # These rules are messy, but are hella worth it.
 doxygen:
diff --git a/libstdc++-v3/Makefile.in b/libstdc++-v3/Makefile.in
index 8e32f158dbc..6eff6c16f3c 100644
--- a/libstdc++-v3/Makefile.in
+++ b/libstdc++-v3/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+# Makefile.in generated automatically by automake 1.4-p6 from Makefile.am
 
 # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
@@ -141,6 +141,8 @@ mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
 
 PWD = $${PWDCMD-pwd}
 
+# Use 'new-abi-baseline' to create an initial symbol file.  Then run
+# 'check-abi' to test for changes against that file.
 baseline_file = @baseline_file@
 
 # Multilib support.
@@ -157,44 +159,7 @@ MULTICLEAN = true
 # Work around what appears to be a GNU make bug handling MAKEFLAGS
 # values defined in terms of make variables, as is the case for CC and
 # friends when we are called from the top level Makefile.
-AM_MAKEFLAGS = \
-	"AR_FLAGS=$(AR_FLAGS)" \
-	"CC_FOR_BUILD=$(CC_FOR_BUILD)" \
-	"CC_FOR_TARGET=$(CC_FOR_TARGET)" \
-	"CFLAGS=$(CFLAGS)" \
-	"CXXFLAGS=$(CXXFLAGS)" \
-	"CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
-	"CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \
-	"INSTALL=$(INSTALL)" \
-	"INSTALL_DATA=$(INSTALL_DATA)" \
-	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
-	"INSTALL_SCRIPT=$(INSTALL_SCRIPT)" \
-	"LDFLAGS=$(LDFLAGS)" \
-	"LIBCFLAGS=$(LIBCFLAGS)" \
-	"LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" \
-	"MAKE=$(MAKE)" \
-	"MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" \
-	"PICFLAG=$(PICFLAG)" \
-	"PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
-	"SHELL=$(SHELL)" \
-	"RUNTESTFLAGS=$(RUNTESTFLAGS)" \
-	"exec_prefix=$(exec_prefix)" \
-	"infodir=$(infodir)" \
-	"libdir=$(libdir)" \
-	"includedir=$(includedir)" \
-	"prefix=$(prefix)" \
-	"tooldir=$(tooldir)" \
-	"AR=$(AR)" \
-	"AS=$(AS)" \
-	"LD=$(LD)" \
-	"LIBCFLAGS=$(LIBCFLAGS)" \
-	"PICFLAG=$(PICFLAG)" \
-	"RANLIB=$(RANLIB)" \
-	"NM=$(NM)" \
-	"NM_FOR_BUILD=$(NM_FOR_BUILD)" \
-	"NM_FOR_TARGET=$(NM_FOR_TARGET)" \
-	"DESTDIR=$(DESTDIR)" \
-	"WERROR=$(WERROR)" 
+AM_MAKEFLAGS =  	"AR_FLAGS=$(AR_FLAGS)" 	"CC_FOR_BUILD=$(CC_FOR_BUILD)" 	"CC_FOR_TARGET=$(CC_FOR_TARGET)" 	"CFLAGS=$(CFLAGS)" 	"CXXFLAGS=$(CXXFLAGS)" 	"CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" 	"CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" 	"INSTALL=$(INSTALL)" 	"INSTALL_DATA=$(INSTALL_DATA)" 	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" 	"INSTALL_SCRIPT=$(INSTALL_SCRIPT)" 	"LDFLAGS=$(LDFLAGS)" 	"LIBCFLAGS=$(LIBCFLAGS)" 	"LIBCFLAGS_FOR_TARGET=$(LIBCFLAGS_FOR_TARGET)" 	"MAKE=$(MAKE)" 	"MAKEINFO=$(MAKEINFO) $(MAKEINFOFLAGS)" 	"PICFLAG=$(PICFLAG)" 	"PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" 	"SHELL=$(SHELL)" 	"RUNTESTFLAGS=$(RUNTESTFLAGS)" 	"exec_prefix=$(exec_prefix)" 	"infodir=$(infodir)" 	"libdir=$(libdir)" 	"includedir=$(includedir)" 	"prefix=$(prefix)" 	"tooldir=$(tooldir)" 	"AR=$(AR)" 	"AS=$(AS)" 	"LD=$(LD)" 	"LIBCFLAGS=$(LIBCFLAGS)" 	"PICFLAG=$(PICFLAG)" 	"RANLIB=$(RANLIB)" 	"NM=$(NM)" 	"NM_FOR_BUILD=$(NM_FOR_BUILD)" 	"NM_FOR_TARGET=$(NM_FOR_TARGET)" 	"DESTDIR=$(DESTDIR)" 	"WERROR=$(WERROR)" 
 
 
 # Subdir rules rely on $(FLAGS_TO_PASS)
@@ -209,7 +174,7 @@ mkcheck.in testsuite_flags.in
 
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
 
-TAR = gtar
+TAR = tar
 GZIP_ENV = --best
 all: all-redirect
 .SUFFIXES:
@@ -486,7 +451,20 @@ check-script-install: $(top_builddir)/mkcheck
 	  @glibcpp_builddir@/mkcheck 1)
 check-abi: $(top_builddir)/testsuite/abi_check
 	-(cd testsuite; \
-	  ./abi_check ${baseline_file})
+	  ${top_srcdir}/config/abi/extract_symvers \
+	     ../src/.libs/libstdc++.so \
+	     ./current_symbols.txt && \
+	  ./abi_check --check ./current_symbols.txt ${baseline_file})
+
+new-abi-baseline:
+	-@(output=${baseline_file}; \
+	  if test -f $${output}; then \
+	    output=$${output}.new; \
+	    t=`echo $${output} | sed 's=.*config/abi/=='`; \
+	    echo "Baseline file already exists, writing to $${t} instead."; \
+	  fi; \
+	  ${top_srcdir}/config/abi/extract_symvers \
+	     src/.libs/libstdc++.so $${output})
 
 # These rules are messy, but are hella worth it.
 doxygen:
diff --git a/libstdc++-v3/config/abi/extract_symvers b/libstdc++-v3/config/abi/extract_symvers
new file mode 100755
index 00000000000..e7b6645900b
--- /dev/null
+++ b/libstdc++-v3/config/abi/extract_symvers
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+# Copyright (C) 2002 Free Software Foundation, Inc.
+#
+# This file is part of the GNU ISO C++ Library.  This library 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 library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this library; see the file COPYING.  If not, write to the Free
+# Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+#
+# As a special exception, you may use this file as part of a free software
+# library without restriction.  Specifically, if other files instantiate
+# templates or use macros or inline functions from this file, or you compile
+# this file and link it with other files to produce an executable, this
+# file does not by itself cause the resulting executable to be covered by
+# the GNU General Public License.  This exception does not however
+# invalidate any other reasons why the executable file might be covered by
+# the GNU General Public License.
+
+
+if test ${#} -lt 2 || test $1 = '--help'; then
+  echo "Usage:  extract_symvers  shared_lib output_file" 1>&2
+  exit 1
+fi
+
+lib=$1
+output=$2
+
+# GNU binutils, somewhere after version 2.11.2, requires -W/--wide to avoid
+# default line truncation.  -W is not supported and truncation did not occur
+# by default before that point.
+readelf="readelf --symbols"
+if readelf --help | grep -- --wide > /dev/null; then
+    readelf="$readelf --wide"
+fi
+
+# This avoids weird sorting problems later.
+export LC_ALL=C
+
+tmp=extract.$$
+
+${readelf} ${lib} | sed '/\.dynsym/,/^$/p;d' | egrep -v ' (LOCAL|UND) ' |\
+awk '{ if ($4 == "FUNC" || $4 == "NOTYPE")
+         printf "%s:%s\n", $4, $8;
+       else if ($4 == "OBJECT")
+         printf "%s:%s:%s\n", $4, $3, $8;
+     }' | sort | uniq > $tmp 2>&1
+#       else printf "Huh?  What is %s?\n", $8;
+
+
+# I think we'll be doing some more with this file, but for now, dump.
+mv $tmp $output
+
+exit 0
diff --git a/libstdc++-v3/testsuite/abi_check.cc b/libstdc++-v3/testsuite/abi_check.cc
index fd030063d0c..1e407811437 100644
--- a/libstdc++-v3/testsuite/abi_check.cc
+++ b/libstdc++-v3/testsuite/abi_check.cc
@@ -28,6 +28,8 @@
 // the GNU General Public License.
 
 // Benjamin Kosnik  <bkoz@redhat.com>
+// Blame subsequent hacks on Loren J. Rittle <ljrittle@acm.org>, Phil
+// Edwards <pme@gcc.gnu.org>, and a cast of dozens at libstdc++@gcc.gnu.org.
 
 #include <string>
 #include <ext/hash_map>
@@ -259,63 +261,41 @@ report_symbol_info(const symbol_info& symbol, std::size_t n)
   cout << endl;
 }
 
-int main(int argc, char** argv)
+
+int
+main(int argc, char** argv)
 {
   using namespace std;
 
-  // Get arguments.
-  if (argc != 2)
+  // Get arguments.  (Heading towards getopt_long, I can feel it.)
+  string argv1;
+  if (argc < 4 || (string("--help") == (argv1 = argv[1])))
     {
-      cerr << "Usage:  abi_check baseline_file" << endl;
+      cerr << "Usage:  abi_check --check    cur baseline\n"
+              "                  --help\n\n"
+              "Where CUR is a file containing the current results from\n"
+              "extract_symvers, and BASELINE is one from config/abi.\n"
+	   << endl;
       exit(1);
     }
-  const char* baseline_file = argv[1];
-  const char* test_file = "current_symbols.txt";
-  const char* test_lib = "../src/.libs/libstdc++.so";
+
+  const char* test_file = argv[2];
+  const char* baseline_file = argv[3];
 
   // Quick sanity/setup check
-  if (access(baseline_file, R_OK) != 0)
-    {
-      cerr << "Cannot read baseline file " << baseline_file << endl;
-      exit(1);
-    }
-  if (access(test_lib, R_OK) != 0)
+  if (access(test_file, R_OK) != 0)
     {
-      cerr << "Cannot read library " << test_lib
+      cerr << "Cannot read symbols file " << test_file
            << ", did you forget to build first?" << endl;
       exit(1);
     }
-
-  // Get list of symbols.
-  // Assume external symbol list computed "as if" by
-  /*
-   readelf -s -W libstdc++.so | sed '/\.dynsym/,/^$/p;d' | egrep -v
-   ' (LOCAL|UND) ' | awk '{ if ($4 == "FUNC" || $4 == "NOTYPE") printf
-   "%s:%s\n", $4, $8; else if ($4 == "OBJECT") printf "%s:%s:%s\n", $4,
-   $3, $8;}' | sort >& current_symbols.txt
-   */
-
-  // GNU binutils, somewhere after version 2.11.2, requires -W/--wide
-  // to avoid default line truncation.  -W is not supported and
-  // truncation did not occur by default before that point.
-  bool readelf_need_wide =
-    (system("readelf --help | grep -- --wide >/dev/null") == 0);
-
-  ostringstream cmd;
-  cmd << "readelf -s " << (readelf_need_wide ? "-W " : "") << test_lib
-      << " | sed '/\\.dynsym/,/^$/p;d' | egrep -v ' (LOCAL|UND) ' | "
-         "awk '{ if ($4 == \"FUNC\" || $4 == \"NOTYPE\") "
-                   "printf \"%s:%s\\n\", $4, $8; "
-                 "else if ($4 == \"OBJECT\") "
-                   "printf \"%s:%s:%s\\n\", $4, $3, $8;}' | sort > "
-      << test_file << " 2>&1";
-  if (system(cmd.str().c_str()) != 0)
+  if (access(baseline_file, R_OK) != 0)
     {
-      cerr << "Unable to generate the list of exported symbols." << endl;
-      exit(2);
+      cerr << "Cannot read baseline file " << baseline_file << endl;
+      exit(1);
     }
 
-  // Input both list of symbols into container.
+  // Input both lists of symbols into container.
   symbol_infos  baseline_symbols;
   symbol_names  baseline_names;
   symbol_infos  test_symbols;
@@ -323,7 +303,7 @@ int main(int argc, char** argv)
   create_symbol_data(baseline_file, baseline_symbols, baseline_names);
   create_symbol_data(test_file, test_symbols, test_names);
 
-  // Basic sanity check. (Was: error checking, what's that?)
+  // More sanity checking.
   const symbol_names::size_type baseline_size = baseline_names.size();
   const symbol_names::size_type test_size = test_names.size();
   if (!baseline_size || !test_size)
-- 
cgit v1.2.1