# Copyright 1998-2013 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"
