# Copyright (C) 2007-2021 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
# GCC 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, or (at your option)
# any later version.
#
# GCC 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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# Run compatibility tests in which the "alt" compiler tries to force
# MIPS16 mode.

# We can only guarantee MIPS16 runtime support for certain targets.
if { ![istarget mipsisa*-*-elf*] && ![istarget mips64vr*-*-elf*] } {
    return
}

load_lib gcc-dg.exp

# Check whether the flags are compatible with MIPS16 code generation.
if { ![check_effective_target_mips16_attribute] } {
    return
}

# Save the old value of CFLAGS_FOR_TARGET, if any.
global saved_CFLAGS_FOR_TARGET
if { [info exists CFLAGS_FOR_TARGET] } {
    set saved_CFLAGS_FOR_TARGET $CFLAGS_FOR_TARGET
} else {
    unset -nocomplain saved_CFLAGS_FOR_TARGET
}

# The "alt" compiler is the normal compiler with an extra "-mips16" argument.
proc compat-use-alt-compiler { } {
    global saved_CFLAGS_FOR_TARGET CFLAGS_FOR_TARGET

    if { [info exists saved_CFLAGS_FOR_TARGET] } {
	set CFLAGS_FOR_TARGET [concat $saved_CFLAGS_FOR_TARGET "-mips16"]
    } else {
	set CFLAGS_FOR_TARGET "-mips16"
    }
}

# Make the compiler under test the default.
proc compat-use-tst-compiler { } {
    global saved_CFLAGS_FOR_TARGET CFLAGS_FOR_TARGET

    if { [info exists saved_CFLAGS_FOR_TARGET] } {
	set CFLAGS_FOR_TARGET $saved_CFLAGS_FOR_TARGET
    } else {
	unset -nocomplain CFLAGS_FOR_TARGET
    }
}

load_lib compat.exp

gcc_init
foreach src [lsort [find $srcdir/$subdir mips16_*_main.c]] {
    if { [runtest_file_p $runtests $src] } {
	compat-execute $src "mips16_inter" 1
    }
}
compat-use-tst-compiler
