# Copyright 1998, 2000-2004, 2007-2012 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.

#
# 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 ""

set obj_include -I[standard_output_file {}]

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} $obj_include"
	set debug-flags "-gdwarf-2"
    }
    "arm*-*-*" {
        set asm-arch arm
    }
    "bfin-*-*" {
        set asm-arch bfin
    }
    "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} $obj_include"
	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} $obj_include"
	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} $obj_include"
            append link-flags " -m elf64ppc"
        } else {
            set asm-arch powerpc
            set asm-flags "-a32 -I${srcdir}/${subdir} $obj_include"
            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} $obj_include"
	set debug-flags "-gdwarf-2"
    }
    "spu*-*-*" {
       set asm-arch spu
       set asm-flags "-I${srcdir}/${subdir} $obj_include --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;
	 }
}

standard_testfile asmsrc1.s 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} $obj_include"
}

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

set asm1obj [standard_output_file asmrc1.o]
set asm2obj [standard_output_file asmrc2.o]

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

# 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"
