abi_check.cc: Pull shell fragments out into...
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
This commit is contained in:
parent
d57551c71b
commit
0e9cab878b
@ -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>
|
2002-09-16 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
* include/std/std_limits.h (__glibcpp_f32_denorm_min_bytes,
|
* include/std/std_limits.h (__glibcpp_f32_denorm_min_bytes,
|
||||||
|
@ -46,10 +46,25 @@ check-script-install: $(top_builddir)/mkcheck
|
|||||||
cd testsuite; \
|
cd testsuite; \
|
||||||
@glibcpp_builddir@/mkcheck 1)
|
@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@
|
baseline_file = @baseline_file@
|
||||||
check-abi: $(top_builddir)/testsuite/abi_check
|
check-abi: $(top_builddir)/testsuite/abi_check
|
||||||
-(cd testsuite; \
|
-(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.
|
# These rules are messy, but are hella worth it.
|
||||||
doxygen:
|
doxygen:
|
||||||
|
@ -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.
|
# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
@ -141,6 +141,8 @@ mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs
|
|||||||
|
|
||||||
PWD = $${PWDCMD-pwd}
|
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@
|
baseline_file = @baseline_file@
|
||||||
|
|
||||||
# Multilib support.
|
# Multilib support.
|
||||||
@ -157,44 +159,7 @@ MULTICLEAN = true
|
|||||||
# Work around what appears to be a GNU make bug handling MAKEFLAGS
|
# 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
|
# values defined in terms of make variables, as is the case for CC and
|
||||||
# friends when we are called from the top level Makefile.
|
# friends when we are called from the top level Makefile.
|
||||||
AM_MAKEFLAGS = \
|
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)"
|
||||||
"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)
|
# Subdir rules rely on $(FLAGS_TO_PASS)
|
||||||
@ -209,7 +174,7 @@ mkcheck.in testsuite_flags.in
|
|||||||
|
|
||||||
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
|
||||||
TAR = gtar
|
TAR = tar
|
||||||
GZIP_ENV = --best
|
GZIP_ENV = --best
|
||||||
all: all-redirect
|
all: all-redirect
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
@ -486,7 +451,20 @@ check-script-install: $(top_builddir)/mkcheck
|
|||||||
@glibcpp_builddir@/mkcheck 1)
|
@glibcpp_builddir@/mkcheck 1)
|
||||||
check-abi: $(top_builddir)/testsuite/abi_check
|
check-abi: $(top_builddir)/testsuite/abi_check
|
||||||
-(cd testsuite; \
|
-(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.
|
# These rules are messy, but are hella worth it.
|
||||||
doxygen:
|
doxygen:
|
||||||
|
64
libstdc++-v3/config/abi/extract_symvers
Executable file
64
libstdc++-v3/config/abi/extract_symvers
Executable file
@ -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
|
@ -28,6 +28,8 @@
|
|||||||
// the GNU General Public License.
|
// the GNU General Public License.
|
||||||
|
|
||||||
// Benjamin Kosnik <bkoz@redhat.com>
|
// 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 <string>
|
||||||
#include <ext/hash_map>
|
#include <ext/hash_map>
|
||||||
@ -259,63 +261,41 @@ report_symbol_info(const symbol_info& symbol, std::size_t n)
|
|||||||
cout << endl;
|
cout << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
|
||||||
|
int
|
||||||
|
main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
// Get arguments.
|
// Get arguments. (Heading towards getopt_long, I can feel it.)
|
||||||
if (argc != 2)
|
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);
|
exit(1);
|
||||||
}
|
}
|
||||||
const char* baseline_file = argv[1];
|
|
||||||
const char* test_file = "current_symbols.txt";
|
const char* test_file = argv[2];
|
||||||
const char* test_lib = "../src/.libs/libstdc++.so";
|
const char* baseline_file = argv[3];
|
||||||
|
|
||||||
// Quick sanity/setup check
|
// Quick sanity/setup check
|
||||||
|
if (access(test_file, R_OK) != 0)
|
||||||
|
{
|
||||||
|
cerr << "Cannot read symbols file " << test_file
|
||||||
|
<< ", did you forget to build first?" << endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
if (access(baseline_file, R_OK) != 0)
|
if (access(baseline_file, R_OK) != 0)
|
||||||
{
|
{
|
||||||
cerr << "Cannot read baseline file " << baseline_file << endl;
|
cerr << "Cannot read baseline file " << baseline_file << endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (access(test_lib, R_OK) != 0)
|
|
||||||
{
|
|
||||||
cerr << "Cannot read library " << test_lib
|
|
||||||
<< ", did you forget to build first?" << endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get list of symbols.
|
// Input both lists of symbols into container.
|
||||||
// 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)
|
|
||||||
{
|
|
||||||
cerr << "Unable to generate the list of exported symbols." << endl;
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Input both list of symbols into container.
|
|
||||||
symbol_infos baseline_symbols;
|
symbol_infos baseline_symbols;
|
||||||
symbol_names baseline_names;
|
symbol_names baseline_names;
|
||||||
symbol_infos test_symbols;
|
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(baseline_file, baseline_symbols, baseline_names);
|
||||||
create_symbol_data(test_file, test_symbols, test_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 baseline_size = baseline_names.size();
|
||||||
const symbol_names::size_type test_size = test_names.size();
|
const symbol_names::size_type test_size = test_names.size();
|
||||||
if (!baseline_size || !test_size)
|
if (!baseline_size || !test_size)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user