# Copyright 1998, 2000, 2001, 2002, 2003, 2004 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 2 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; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
# 
# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu
#
# This file was written by Kendra.

if $tracelevel then {
    strace $tracelevel
}

#
# Test debugging assembly level programs.
# This file uses asmsrc[12].s for input.
#

set prms_id 0
set bug_id 0

set asm-arch ""
set asm-note "empty"
set asm-flags ""
set link-flags "--entry _start"
set debug-flags ""

switch -glob -- [istarget] {
    "alpha*-*-*" {
        set asm-arch alpha
	# ??? Won't work with ecoff systems like Tru64, but then we also
	# don't have any other -g flag that creates mdebug output.
        set asm-flags "-no-mdebug -I${srcdir}/${subdir} -I${objdir}/${subdir}"
	set debug-flags "-gdwarf-2"
    }
    "*arm-*-*" {
        set asm-arch arm
    }
    "xscale-*-*" {
        set asm-arch arm
    }
    "d10v-*-*" {
        set asm-arch d10v
    }
    "frv-*-*" {
	set asm-arch frv
    }
    "s390-*-*" {
        set asm-arch s390
    }
    "s390x-*-*" {
        set asm-arch s390x
    }
    "x86_64-*-*" {
        set asm-arch x86_64
        set asm-flags "-I${srcdir}/${subdir} -I${objdir}/${subdir}"
	set debug-flags "-gdwarf-2"
    }
    "i\[3456\]86-*-*" {
        set asm-arch i386
    }
    "m32r*-linux*" {
        set asm-arch m32r-linux
    }
    "m32r*-*" {
        set asm-arch m32r
        append link-flags "--whole-archive -lgloss --no-whole-archive"
    }
    "m6811-*-*" {
        set asm-arch m68hc11
        set asm-flags "-mshort-double -m68hc11 -gdwarf-2 --no-warn -I${srcdir}/${subdir} -I${objdir}/${subdir}"
    }
    "m6812-*-*" {
        set asm-arch m68hc11
        set asm-flags "-mshort-double -m68hc12 -gdwarf-2 --no-warn -I${srcdir}/${subdir} -I${objdir}/${subdir}"
    }
    "mips*-*" {
        set asm-arch mips
    }
    "powerpc*-*" {
        set asm-arch powerpc
    }
    "*-apple-darwin*" {
        set asm-arch ""
    }
    "sh*-*-*" {
        set asm-arch sh
        set asm-flags "-I${srcdir}/${subdir} -I${objdir}/${subdir}"
	set debug-flags "-gdwarf-2"
    }
    "sparc-*-*" {
        set asm-arch sparc
    }
    "sparc64-*-*" {
        set asm-arch sparc64
        set asm-flags "-xarch=v9 -I${srcdir}/${subdir} -I${objdir}/${subdir}"
	set debug-flags "-gdwarf-2"
    }
    "xstormy16-*-*" {
        set asm-arch xstormy16
        set asm-flags "-I${srcdir}/${subdir} -I${objdir}/${subdir}"
	set debug-flags "-gdwarf-2"
    }
    "v850-*-*" {
        set asm-arch v850
        set gdb_wrapper_initialized 1
    }
    "m68k-*-*" {
        set asm-arch m68k
    }
    "ia64-*-*" {
        set asm-arch ia64
        set asm-flags "-I${srcdir}/${subdir} -I${objdir}/${subdir}"
	set debug-flags "-gdwarf-2"
    }
    "iq2000-*-*" {
    	set asm-arch iq2000
    }
    "hppa*-linux-*" {
        set asm-arch pa
        set asm-flags "-I${srcdir}/${subdir} -I${objdir}/${subdir}"
	set debug-flags "-gdwarf-2"
    }
    "h83*-*" {
	set asm-arch h8300
	set asm-flags "-gdwarf2 -I${srcdir}/${subdir} -I${objdir}/${subdir}"
    }
}

if { "${asm-arch}" == "" } {
    gdb_suppress_entire_file "Assembly source test -- not implemented for this target."
    return
}

# APPLE LOCAL: Skip on Darwin systems.  Our assembler doesn't support
# all of the directives used in this directory, at the very least.

if { [istarget "*-apple-darwin*"] } then {
    return
    gdb_suppress_entire_file "Assembly source test -- not implemented for this target."
}
  

# On NetBSD/ELF we need a special NetBSD-identifying note section.
if { [istarget "*-*-netbsdelf*"]
     || [istarget "mips*-*-netbsd*"]
     || [istarget "x86_64-*-netbsd*"] } then {
    set asm-note "netbsd"
}

# On OpenBSD/ELF we need a similar note section.  We make no attempt
# of handing a.out here since most OpenBSD/a.out systems use a rather
# outdated assembler that doesn't assemble this test's code anyway.
if { [istarget "*-*-openbsd*"] } then {
    set asm-note "openbsd"
}

# Watch out, we are invoking the assembler, but the testsuite sets multilib
# switches according to compiler syntax.  If we pass these options straight
# to the assembler, they won't always make sense.  If we don't pass them to
# the assembler, the final link will complain that the object files were
# built with different defaults.  So no matter what we do, we lose.  We may as
# well get out of this test sooner rather than later.
set dest [target_info name]
if [board_info $dest exists multilib_flags] {
	set multilib_flags [board_info $dest multilib_flags]
	if { "${multilib_flags}" != "" } {
	   gdb_suppress_entire_file "Assembly source test -- multilibs not supported by this test."
	 }
}

set testfile "asm-source"
set binfile ${objdir}/${subdir}/${testfile}
set srcfile1 asmsrc1.s
set srcfile2 asmsrc2.s

remote_exec build "rm -f ${subdir}/arch.inc"
remote_download host ${srcdir}/${subdir}/${asm-arch}.inc ${subdir}/arch.inc
remote_exec build "rm -f ${subdir}/note.inc"
remote_download host ${srcdir}/${subdir}/${asm-note}.inc ${subdir}/note.inc

if { "${asm-flags}" == "" } {
    set asm-flags "-I${srcdir}/${subdir} -I${objdir}/${subdir}"
    set debug-flags "-gstabs"
}

# Allow the target board to override the debug flags.
if { [board_info $dest exists debug_flags] } then {
    set debug-flags "[board_info $dest debug_flags]"
}

# The debug flags are in the format that gcc expects:
# "-gdwarf-2", "-gstabs+", or "-gstabs".  To be compatible with the
# other languages in the test suite, we accept this input format.
# So the user can run the test suite with:
#
#   runtest --target_board unix/gdb:debug_flags=-gdwarf-2
#   make check RUNTESTFLAGS="--target_board unix/gdb:debug_flags=-gdwarf-2"
#
# However, the GNU assembler has different spellings than gcc.
# So I adjust the debug flags here.

# The GNU assembler spells "dwarf-2" as "dwarf2".
regsub "--" "-gdwarf-2" "${debug-flags}" "-gdwarf2" debug-flags

# The GNU assembler before 2.15 did not support "stabs+".
regsub "--" "-gstabs\[+\]" "${debug-flags}" "-gstabs" debug-flags

# The GNU assembler does not support level options like "-g2" or "-g3".
regsub "--" "-g\[0-9\]" "${debug-flags}" "" debug-flags

if {[target_assemble ${srcdir}/${subdir}/${srcfile1} asmsrc1.o "${asm-flags} ${debug-flags}"] != ""} then {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}
if {[target_assemble ${srcdir}/${subdir}/${srcfile2} asmsrc2.o "${asm-flags} ${debug-flags}"] != ""} then {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

# We deliberately don't use gdb_compile here to link together the
# assembled object files.  Using gdb_compile, and therefore the C
# compiler, is conceptually wrong, since we're testing raw assembler
# code here that provides its own startup code.  Using target_link
# also avoids a lot of problems on many systems, most notably on
# *-*-*bsd* and *-*-solaris2*.
if {[target_link "asmsrc1.o asmsrc2.o" "${binfile}" ${link-flags}] != "" } then {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

remote_exec build "mv asmsrc1.o asmsrc2.o ${objdir}/${subdir}"


gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

#
# Run to `main' where we begin our tests.
#

if ![runto_main] then {
    gdb_suppress_tests
}

# Execute the `f' command and see if the result includes source info.
gdb_test "f" "asmsrc1\[.\]s:29.*several_nops" "f at main"

# See if we properly `next' over a macro with several insns.
gdb_test "n" "33\[ 	\]*.*foo2" "next over macro"

# See if we can properly `step' into a subroutine call.
gdb_test "s" "8\[ 	\]*.*" "step into foo2"

# Test 'info target', and incidentally capture the entry point address.
set entry_point 0
send_gdb "info target\n"
gdb_expect {
    -re "Symbols from .*asm-source.*Entry point: 0x(\[01232456789abcdefABCDEF\]+).*$gdb_prompt $" {
	set entry_point $expect_out(1,string)
	pass "info target"
    }
    -re ".*$gdb_prompt $" {
	fail "info target"
    }
    timeout {
	fail "info target (timeout)"
    }
}

# Capture the start symbol (may be '_start' or 'start')
set entry_symbol ""
send_gdb "info symbol 0x$entry_point\n"
gdb_expect {
    -re "info symbol 0x$entry_point\[\r\n\]+(\[^\r\n\]*) in section .*$gdb_prompt $" {
        # We match the echoed `info symbol' command here, to help us
        # reliably identify the beginning of the start symbol in the
        # command's output.  You might think we could just use '^' to
        # start matching at the beginning of the line, but
        # unfortunately, in Expect, '^' matches the beginning of the
        # input that hasn't been matched by any expect clause yet.  If
        # every expect clause consumes a complete line, along with its
        # terminating CR/LF, this is equivalent to the beginning of a
        # line.  But expect clauses that end with `.*' will consume as
        # much as happened to arrive from the TTY --- exactly where
        # they leave you depends on inter-process timing.  :(
	set entry_symbol $expect_out(1,string)
	pass "info symbol"
    }
    -re ".*$gdb_prompt $" {
	fail "info symbol"
    }
    timeout {
	fail "info symbol (timeout)"
    }
}

# Now try a 'list' from the other source file.
gdb_test "list $entry_symbol" ".*gdbasm_startup.*" "list"

# Now try a source file search
gdb_test "search A routine for foo2 to call" \
	"40\[ \t\]+comment \"A routine for foo2 to call.\"" "search"

# See if `f' prints the right source file.
gdb_test "f" ".*asmsrc2\[.\]s:8.*" "f in foo2"

# `next' one insn (or macro) to set up our stackframe (for the following bt).
gdb_test "n" "12\[ 	\]*.*foo3" "n in foo2"

# See if a simple `bt' prints the right source files and 
# doesn't fall off the stack.

gdb_test "bt 10" \
	"\#0.*foo2.*asmsrc2\[.\]s:12.*\#1.*main.*asmsrc1\[.\]s:33" \
	"bt ALL in foo2"

# See if a capped `bt' prints the right source files.
gdb_test "bt 2" "\#0.*foo2.*asmsrc2\[.\]s:12.*\#1.*main.*asmsrc1\[.\]s:33.*" "bt 2 in foo2"

# Step into another subroutine which lives back in the first source file.
gdb_test "s" "" "s 2"

# Next over insns to set up the stack frame.
gdb_test "n" "" "n 2"

# Now see if a capped `bt' is correct.
gdb_test "bt 3" "\#0.*foo3.*asmsrc1\[.\]s:45.*\#1.*foo2.*asmsrc2\[.\]s:12.*\#2.*main.*asmsrc1\[.\]s:33.*" "bt 3 in foo3"

# Try 'info source' from asmsrc1.s
gdb_test "info source" \
	"Current source file is .*asmsrc1.s.*Source language is asm.*" \
	"info source asmsrc1.s"

# Try 'finishing' from foo3
gdb_test "finish" "Run till exit from.*\[\r\n\]13\[ \t\]+gdbasm_call foo3" \
	"finish from foo3"

# Try 'info source' from asmsrc2.s
gdb_test "info source" \
	"Current source file is .*asmsrc2.s.*Source language is asm.*" \
	"info source asmsrc2.s"

# Try 'info sources'.  This can produce a lot of output on systems
# with dynamic linking, where the system's shared libc was compiled
# with debugging info; for example, on Linux, this produces 47kb of
# output.  So we consume it as we go.
send_gdb "info sources\n"
set seen_asmsrc_1 0
set seen_asmsrc_2 0
gdb_expect {
    -re "^\[^,\]*asmsrc1.s(, |\[\r\n\]+)" {
        set seen_asmsrc_1 1
        exp_continue
    }
    -re "^\[^,\]*asmsrc2.s(, |\[\r\n\]+)" {
        set seen_asmsrc_2 1
        exp_continue
    }
    -re ", " { 
        exp_continue
    }
    -re "$gdb_prompt $" {
        if {$seen_asmsrc_1 && $seen_asmsrc_2} {
            pass "info sources"
        } else {
            fail "info sources"
        }
    }
    timeout {
            fail "info sources (timeout)"
    }
}
        

# Try 'info line'
gdb_test "info line" \
	"Line 13 of.*asmsrc2.s.*starts at.*<foo2+.*> and ends at.*<foo2+.*>." \
	"info line"

# Try 'nexting' over next call to foo3
gdb_test "next" "17\[ \t\]+gdbasm_leave" "next over foo3"

# Try 'return' from foo2
gdb_test "return" "\#0  main .*37\[ \t\]+gdbasm_exit0" "return from foo2" \
	"Make (foo2|selected stack frame) return now\?.*" "y"

# Disassemble something, check the output
proc test_dis { command var } {
    global gdb_prompt
    send_gdb "${command}\n"
    gdb_expect {
	-re "${var}.*:.*(Cannot access|Bad address)" {
	    # The "disassembler" was only accessing the local
	    # executable and that would cause attempts to disassemble
	    # variables to fail (memory not valid).
	    fail "${command} (memory read error)"
	}
	-re "${var}.*:.*${gdb_prompt}" {
	    pass "${command}"
	}
	timeout {
	    fail "${command} (timeout)"
	}
    }
}

# See if we can look at a global variable, three ways
gdb_test "print globalvar" ".* = 11" "look at global variable"
test_dis "x/i &globalvar" "globalvar"
test_dis "disassem &globalvar &globalvar+1" "globalvar"

# See if we can look at a static variable, three ways
gdb_test "print staticvar" ".* = 5" "look at static variable"
test_dis "x/i &staticvar" "staticvar"
test_dis "disassem &staticvar &staticvar+1" "staticvar"

# See if we can look at a static function
gdb_test "disassem foostatic" ".*<foostatic\\+0>:.*End of assembler dump." \
	"look at static function"

remote_exec build "rm -f ${subdir}/arch.inc"
remote_exec build "rm -f ${subdir}/note.inc"
