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

# GCC testsuite that uses the `dg.exp' driver.

# Exit immediately if this isn't an ARM target.
if ![istarget arm*-*-*] then {
  return
}

# Load support procs.
load_lib gcc-dg.exp

# Initialize `dg'.
dg-init

set saved-dg-do-what-default ${dg-do-what-default}
set dg-do-what-default "assemble"

set saved-lto_torture_options ${LTO_TORTURE_OPTIONS}

# Add -ffat-lto-objects option to all LTO options such that we can do assembly
# scans.
proc add_fat_objects { list } {
    set res {}
    foreach el $list {set res [lappend res [concat $el " -ffat-lto-objects"]]}
    return $res
};
set LTO_TORTURE_OPTIONS [add_fat_objects ${LTO_TORTURE_OPTIONS}]

# Main loop.
gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \
	"" ""

# Restore globals
set dg-do-what-default ${saved-dg-do-what-default}
set LTO_TORTURE_OPTIONS ${saved-lto_torture_options}
# All done.
dg-finish
