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

# Only run whole abi.exp in one instance, serially.
if ![gcc_parallel_test_run_p abi] {
    return
}
gcc_parallel_test_enable 0

if { [string match "*-*-darwin*" $target_triplet] } {
    set lib $blddir/src/.libs/libstdc++.dylib
} else { 
    set lib $blddir/src/.libs/libstdc++.so
}

# Build the support objects.
v3-build_support

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

set baseline_subdir "[eval exec $cxx $baseline_subdir_switch]"

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] {
    gcc_parallel_test_enable 1
    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" "$blddir/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] "libstdc++-abi/abi_check"

gcc_parallel_test_enable 1
