# Copyright (C) 2005 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 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.  

# If there is no baseline file, or we can't find the library, skip
# this test. Or, hey, if we don't support this kind of symbol
# versioning test: don't run it.

# Build the support objects.
v3-build_support

if { (${v3-symver} == 0) || ![info exists baseline_file] \
	 || ![file exists $baseline_file] \
	 || ![file exists "../src/.libs/libstdc++.so"] } {
    return
}

# Figure out what symbols are defined by the active build of the library.
remote_exec "build" "$srcdir/../scripts/extract_symvers" \
    [list "../src/.libs/libstdc++.so" "current_symbols.txt"]

# Build the abi_check program.
if { [v3_target_compile "$srcdir/util/testsuite_abi_check.cc" "abi_check" \
      "executable" [list "additional_flags=-w"]] != "" } {
    error "could not compile testsuite_abi_check.cc"
}

remote_download "target" $baseline_file "baseline_symbols.txt"
remote_download "target" "current_symbols.txt" "current_symbols.txt"
set result [${tool}_load "./abi_check" \
		[list "--check-verbose" "current_symbols.txt" \
		     "baseline_symbols.txt"]]
[lindex $result 0] "abi_check"
