# Copyright 1998, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010
# 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 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
    }
    "lm32-*" {
        set asm-arch lm32
    }
    "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*-*" {
        if { [is_lp64_target] } {
            set asm-arch powerpc64
            set asm-flags "-a64 -I${srcdir}/${subdir} -I${objdir}/${subdir}"
            append link-flags " -m elf64ppc"
        } else {
            set asm-arch powerpc
            set asm-flags "-a32 -I${srcdir}/${subdir} -I${objdir}/${subdir}"
            append link-flags " -m elf32ppc"
        }
    }
    "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
gdb_test_multiple "info target" "info target" {
    -re "Symbols from .*asm-source.*Entry point: 0x(\[01232456789abcdefABCDEF\]+).*$gdb_prompt $" {
	set entry_point $expect_out(1,string)
	pass "info target"
    }
}

# Capture the start symbol (may be '_start' or 'start')
set entry_symbol ""
gdb_test_multiple "info symbol 0x$entry_point" "info symbol" {
    -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"
    }
}

# 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
# Some architectures will have one or more instructions after the
# call instruction which still is part of the call sequence, so we
# must be prepared for a "finish" to show us the caller line
# again as well as the statement after.
gdb_test_multiple "finish" "finish from foo3" {
    -re "Run till exit from.*\[\r\n\]$line_call_foo3\[ \t\]+gdbasm_call foo3.*$gdb_prompt $" {
        pass "finish from foo3"
        gdb_test "s" ".*" "s after finish"
    }
    -re "Run till exit from.*\[\r\n\]$line_call_foo3_again\[ \t\]+gdbasm_call foo3.*$gdb_prompt $" {
        pass "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.
set seen_asmsrc_1 0
set seen_asmsrc_2 0
gdb_test_multiple "info sources" "info sources" {
    -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"
        }
    }
}
        

# 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
# Like "finish", "return" command also can return to the caller
# line again or the statement after, depending on the architecture.
gdb_test_multiple "return" "return from foo2" {
    -re "Make (foo2|selected stack frame) return now\?.*" {
        send_gdb "y\n"
        exp_continue
    }
    -re "\#0.*main .*$line_call_foo2\[ \t\]+gdbasm_call foo2.*$gdb_prompt $" {
        pass "return from foo2"
        gdb_test "s" ".*" "s after return"
    }
    -re "\#0.*main .*$line_main_exit\[ \t\]+gdbasm_exit0.*$gdb_prompt $" {
        pass "return from foo2"
    }
}

# Disassemble something, check the output
proc test_dis { command var } {
    global gdb_prompt
    gdb_test_multiple "${command}" "${command}" {
	-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}"
	}
    }
}

# 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" ".*<\\+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"
