# Copyright (C) 2010-2021 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 test tries to disassemble over the boundary between two compilation
# units displaying source lines.  This checks that the disassemble routine
# can handle our use of line number 0 to mark the end of sequence.

if { [prepare_for_testing "failed to prepare" "disasm-end-cu" {disasm-end-cu-1.c disasm-end-cu-2.c} {debug}] } {
    return -1
}

if ![runto_main] {
    return -1
}

set main_addr [get_hexadecimal_valueof "&main" "0"]
set dummy_3_addr [get_hexadecimal_valueof "&dummy_3" "0"]

if {$main_addr == 0 || $dummy_3_addr == 0 || $dummy_3_addr <= $main_addr} {
    fail "unable to extract required addresses, or addresses out of order"
    return -1
}

gdb_test_multiple "disassemble /m ${main_addr},${dummy_3_addr}" "disassemble address range with source" {
    -re "Dump of assembler code from ${main_addr} to ${dummy_3_addr}:\r\nEnd of assembler dump\." {
        fail "no output from the disassemble command"
    }
    -re "Line number 0 out of range;.* has $decimal lines\." {
        fail "the disassemble command failed"
    }
    -re "Dump of assembler code from ${main_addr} to ${dummy_3_addr}:\r\n.*main.*End of assembler dump\." {
        pass "disassemble command returned some output"
    }
    -re ".*$gdb_prompt $" {
        fail "unexpected output from disassemble command"
    }
}
