# Copyright 2011-2020 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/>.
load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
    return 0  
}

standard_testfile

set srcfile_outer ${testfile}-outer.S
set srcfile_inner ${testfile}-inner.S
set executable_outer ${testfile}-outer.x
set binfile_outer ${binfile}-outer.x
set binfile_inner ${binfile}-inner.x

if { [gdb_compile "${srcdir}/${subdir}/${srcfile_outer}" "${binfile_outer}" \
      object {}] != ""
     || [gdb_compile "${srcdir}/${subdir}/${srcfile_inner}" "${binfile_inner}" \
      object {}] != "" } {
    return -1
}

clean_restart $executable_outer

gdb_test "add-symbol-file $binfile_inner outer_inner" \
         {Reading symbols from .*\.\.\.} "add-symbol-file" \
	 "\r\n\t\\.text_addr = 0x\[0-9a-f\]+\r\n\\(y or n\\) \$" "y"

# Expand symtab for ${binfile_outer}.
gdb_breakpoint "*outer_before"

# FAIL was:
# No line number information available for address 0x4 <outer_inner>
gdb_test "info line inner" {Line 2 of "inner\.c" starts at address .*}
