# Copyright 1998, 2000, 2001, 2002, 2003, 2004, 2007, 2008
# 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.  If not, see <http://www.gnu.org/licenses/>.
#
# 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 "-e _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
    }
    "frv-*-*" {
	set asm-arch frv
    }
    "s390-*-*" {
        set asm-arch s390
    }
    "s390x-*-*" {
        set asm-arch s390x
    }
    "x86_64-*-*" {
        set asm-arch x86_64
	set debug-flags "-gdwarf-2"
    }
    "i\[3456\]86-*-*" {
        set asm-arch i386
    }
    "m32r*-linux*" {
        set asm-arch m32r-linux
    }
    "m32c-*-*" {
        set asm-arch m32c
    }
    "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 --no-warn -I${srcdir}/${subdir} -I${objdir}/${subdir}"
	set debug-flags "-gdwarf-2"
	# This asm test is specific and uses the linker directly.
	# We must not use the target board linker script defined for other
	# tests.  Remove it and restore it later on.
	set board [target_info name]
	set old_ldscript [board_info $board ldscript]
	unset_board_info "ldscript"
    }
    "m6812-*-*" {
        set asm-arch m68hc11
        set asm-flags "-mshort-double -m68hc12 --no-warn -I${srcdir}/${subdir} -I${objdir}/${subdir}"
	set debug-flags "-gdwarf-2"
	# This asm test is specific and uses the linker directly.
	# We must not use the target board linker script defined for other
	# tests.  Remove it and restore it later on.
	set board [target_info name]
	set old_ldscript [board_info $board ldscript]
	set_board_info ldscript ""
    }
    "mips*-*" {
        set asm-arch mips
    }
    "powerpc*-*" {
        set asm-arch powerpc
    }
    "sh*-*-*" {
        set asm-arch sh
	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"
    }
    "spu*-*-*" {
       set asm-arch spu
       set asm-flags "-I${srcdir}/${subdir} -I${objdir}/${subdir} --no-warn"
       set debug-flags "-gdwarf-2"
    }
    "xstormy16-*-*" {
        set asm-arch xstormy16
	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 debug-flags "-gdwarf-2"
    }
    "iq2000-*-*" {
    	set asm-arch iq2000
    }
    "hppa*-linux-*" {
        set asm-arch pa
	set debug-flags "-gdwarf-2"
    }
    "hppa-*-openbsd*" {
        set asm-arch pa
	set debug-flags "-gdwarf-2"
    }
    "hppa64-*-hpux*" {
        set asm-arch pa64
	set debug-flags "-gdwarf-2"
    }
    "h83*-*" {
	set asm-arch h8300
        set debug-flags "-gdwarf-2"
    }
}

if { "${asm-arch}" == "" } {
    untested asm-source.exp
    return -1
}

# On NetBSD/ELF we need a special NetBSD-identifying note section.
if { [istarget "*-*-netbsdelf*"]
     || [istarget "alpha-*-netbsd*"]
     || [istarget "mips*-*-netbsd*"]
     || [istarget "powerpc-*-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}" != "" } {
	   untested asm-source.exp
	   return -1
	   return;
	 }
}

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 { [string equal ${asm-flags} ""] } {
    set asm-flags "-I${srcdir}/${subdir} -I${objdir}/${subdir}"
}

if { [string equal ${debug-flags} ""] } {
    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 {
     untested asm-source.exp
     return -1
}
if {[target_assemble ${srcdir}/${subdir}/${srcfile2} asmsrc2.o "${asm-flags} ${debug-flags}"] != ""} then {
     untested asm-source.exp
     return -1
}

# 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 {
     untested asm-source.exp
     return -1
}

# Restore the target board linker script for HC11/HC12.
if { [istarget "m6811-*-*"] || [istarget "m6812-*-*"] } {
    set_board_info ldscript $old_ldscript
}

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

# Collect some line numbers.
set line_main       [expr [gdb_get_line_number "main start" "asmsrc1.s"] + 1]
set line_call_foo2  [expr [gdb_get_line_number "call foo2"  "asmsrc1.s"] + 1]
set line_search_comment [expr [gdb_get_line_number "search" "asmsrc1.s"] + 1]
set line_foo3       [expr [gdb_get_line_number "foo3 start" "asmsrc1.s"] + 1]
set line_main_exit  [expr [gdb_get_line_number "main exit"  "asmsrc1.s"] + 1]
set line_foo2       [expr [gdb_get_line_number "foo2 start" "asmsrc2.s"] + 1]
set line_call_foo3  [expr [gdb_get_line_number "call foo3"  "asmsrc2.s"] + 1]
set line_call_foo3_again [expr $line_call_foo3 + 1]
set line_foo2_leave [expr [gdb_get_line_number "foo2 leave" "asmsrc2.s"] + 1]

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:$line_main.*several_nops" "f at main"

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

# See if we can properly `step' into a subroutine call.
gdb_test "s" "$line_foo2\[ 	\]*.*" "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" \
	"$line_search_comment\[ \t\]+comment \"A routine for foo2 to call.\"" "search"

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

# `next' one insn (or macro) to set up our stackframe (for the following bt).
gdb_test "n" "$line_call_foo3\[ 	\]*.*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:$line_call_foo3.*\#1.*main.*asmsrc1\[.\]s:$line_call_foo2" \
	"bt ALL in foo2"

# See if a capped `bt' prints the right source files.
gdb_test "bt 2" "\#0.*foo2.*asmsrc2\[.\]s:$line_call_foo3.*\#1.*main.*asmsrc1\[.\]s:$line_call_foo2.*" "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:$line_foo3.*\#1.*foo2.*asmsrc2\[.\]s:$line_call_foo3.*\#2.*main.*asmsrc1\[.\]s:$line_call_foo2.*" "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\]$line_call_foo3_again\[ \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 $line_call_foo3_again of.*asmsrc2.s.*starts at.*<foo2+.*> and ends at.*<foo2+.*>." \
	"info line"

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

# Try 'return' from foo2
gdb_test "return" "\#0  main .*$line_main_exit\[ \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"
