# Copyright (C) 2005, 2009 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 3 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; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# 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.

set lib $blddir/src/.libs/libstdc++.so
set baseline_subdir "[eval exec $cxx --print-multi-dir]"

# Build the support objects.
v3-build_support

if { (${v3-symver} == 0) || ![info exists baseline_dir] \
	 || ![file exists $baseline_dir] \
	 || ![file exists $lib] } {
    return
}

set baseline_file \
    [file join $baseline_dir $baseline_subdir "baseline_symbols.txt"]
# If there is no ABI-specific reference file use that of the default ABI.
if ![file exists $baseline_file] {
    set baseline_file [file join $baseline_dir "baseline_symbols.txt"]
}
if ![file exists $baseline_file] {
    return
}
send_log "Checking $lib against $baseline_file\n"

# Figure out what symbols are defined by the active build of the library.
remote_exec "build" "$srcdir/../scripts/extract_symvers" \
    [list $lib "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"
