diff options
author | pme <pme@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-09-16 18:58:48 +0000 |
---|---|---|
committer | pme <pme@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-09-16 18:58:48 +0000 |
commit | 7433ab8f20c762d62fb505cb2316dbb60047fa66 (patch) | |
tree | ab40768ae74414e153548bd1f80a6b60136d70fb | |
parent | 26906dc1f00868babc8e3f7e89e2b113f0ab740e (diff) | |
download | gcc-7433ab8f20c762d62fb505cb2316dbb60047fa66.tar.gz |
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 8 | ||||
-rw-r--r-- | libstdc++-v3/Makefile.am | 17 | ||||
-rw-r--r-- | libstdc++-v3/Makefile.in | 60 | ||||
-rwxr-xr-x | libstdc++-v3/config/abi/extract_symvers | 64 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/abi_check.cc | 66 |
5 files changed, 130 insertions, 85 deletions
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) |