abi_check.cc: Pull shell fragments out into...
authorPhil Edwards <pme@gcc.gnu.org>
Mon, 16 Sep 2002 18:58:48 +0000 (18:58 +0000)
committerPhil Edwards <pme@gcc.gnu.org>
Mon, 16 Sep 2002 18:58:48 +0000 (18:58 +0000)
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.

From-SVN: r57208

libstdc++-v3/ChangeLog
libstdc++-v3/Makefile.am
libstdc++-v3/Makefile.in
libstdc++-v3/config/abi/extract_symvers [new file with mode: 0755]
libstdc++-v3/testsuite/abi_check.cc

index 113a0df6bd087df2802fd2f41fb6919d537a3bd8..0d8f5c35f3ee667964778a59f774a0a0caed0c6e 100644 (file)
@@ -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,
index e3822dcc90141115facfb70d06ad897bfaf1b469..410aa5549a7c040d66e8e81361e8a12a06a9eb9e 100644 (file)
@@ -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:
index 8e32f158dbcf06a96c51cb7c9c6e82ba1ff1a322..6eff6c16f3c9bbe186a436ef0a0db26f53fd00c0 100644 (file)
@@ -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 (executable)
index 0000000..e7b6645
--- /dev/null
@@ -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
index fd030063d0c001ee2e82979f5b406c1b4221bb78..1e407811437a3cf479f2f2e40d0ba046d4b53e53 100644 (file)
@@ -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)