# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
# Foundation, Inc.
#
# This file is part of DejaGnu.
#
# DejaGnu 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.
#
# DejaGnu 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 DejaGnu; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# This is a list of toolchains that are supported on this board.
set_board_info target_install {m68k-elf}

# Load the generic configuration for this board. This will define any
# routines needed by the tool to communicate with the board.
load_generic_config "cfdbug"

# Need -m5200 by default.
process_multilib_options "-m5200"

# The compiler used to build for this board. Note that this has nothing to do
# with what compiler is tested when testing gcc.
set_board_info compiler "[find_gcc]"

set_board_info cflags "[newlib_include_flags] [libgloss_include_flags]"

# Nasty hack.
if { [board_info $board obj_format] == "a.out" } {
    # Need to pass the start address to objcopy.
    set_board_info use_vma_offset 1
    # Wrapping has to be specially done for m68k-aout, for whatever reason.
    set_board_info wrap_m68k_aout 1

    set extra_m68k_ld_flags "-N"

    # We need to tell GDB to load at the correct offset.
    set_board_info gdb_load_offset [board_info $board hex_startaddr]
} else {
    set extra_m68k_ld_flags ""
}

set_board_info ldflags "$extra_m68k_ld_flags [libgloss_link_flags] [newlib_link_flags]"
unset extra_m68k_ld_flags


# If no output format is specified, use objcopy.
if ![board_info $board exists output_format] {
    set tempfil [lookfor_file $tool_root_dir binutils/objcopy]
    if { $tempfil != "" } {
	set_board_info objcopy $tempfil
    } else {
	set_board_info objcopy [transform objcopy]
    }
    unset tempfil
}

# SBC5204 linker script.
set_board_info ldscript "-Wl,-Tsbc5204.ld"
# The idt interface can't return exit statuses, so gcc (ctorture et
# al) needs to do what it can to get them.
set_board_info needs_status_wrapper 1

# Used by a few gcc.c-torture testcases to delimit how large the stack can be.
# The board has 192K of RAM.  We will set stack size to one third of that.
set_board_info gcc,stack_size 65536

# GDB needs to use "target dbug" to talk to the board.
set_board_info gdb_protocol  "dbug"

# Can't pass arguments to the program under test.
set_board_info noargs 1

# Nor can it do I/O in GDB.
set_board_info gdb,noinferiorio 1

# It has no signals.
set_board_info gdb,nosignals 1

# It can't return results when debugging with GDB.
set_board_info gdb,noresults 1

# Pseudo-random guess.
set_board_info sys_speed_value 200
