# Copyright (C) 2011-2017 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/>.

set testfile dmsym_main

# Build dmsym_main using two C files:
#   - dmsym.c, which needs to be built without debug info;
#   - dmsym_main.c, which needs to be build with debug info.
# This is why we use gdb_compile instead of relying on the usual
# call to prepare_for_testing.

set dmsym_o [standard_output_file dmsym.o]

if {[gdb_compile "${srcdir}/${subdir}/dmsym.c" \
                 $dmsym_o \
                 object {}] != ""} {
  untested "failed to compile object file"
  return -1
}

if {[gdb_compile \
      [list ${srcdir}/${subdir}/dmsym_main.c $dmsym_o] \
      [standard_output_file ${testfile}] \
      executable {debug}] != ""} {
    untested "failed to compile"
    return -1
}

clean_restart ${testfile}

# Some convenient regular expressions...
set num "\[0-9\]+"
set addr "0x\[0-9a-zA-Z\]+"

# Although the test program is written in C, the original problem
# occurs only when the language is Ada. The use of a C program is
# only a convenience to be able to exercise the original problem
# without requiring an Ada compiler. In the meantime, temporarily
# force the language to Ada.

gdb_test_no_output "set lang ada"

# Verify that setting a breakpoint on `pck__foo__bar__minsym' only
# results in one location found (function pck__foo__bar__minsym__2).
# A mistake would be to also insert a breakpoint where
# pck__foo__bar__minsym is defined.  Despite the fact that there is
# no debugging info available, this is a data symbol and thus should
# not be used for breakpoint purposes.

gdb_test "break pck__foo__bar__minsym" \
         "Breakpoint $num at $addr.: file .*dmsym_main\\.c, line $num\\."

# However, verify that the `info line' command, on the other hand,
# finds both locations.

gdb_test "info line pck__foo__bar__minsym" \
         "Line $num of \".*dmsym_main\\.c\" .*\r\nNo line number information available for address $addr <pck__foo__bar__minsym>"

gdb_test_no_output "set lang auto"

# Now, run the program until we get past the call to
# pck__foo__bar__minsym__2. Except when using hardware breakpoints,
# inferior behavior is going to be affected if a breakpoint was
# incorrectly inserted at pck__foo__bar__minsym.

gdb_breakpoint dmsym_main.c:[gdb_get_line_number "BREAK" dmsym_main.c]

gdb_run_cmd
gdb_test "" \
         "Breakpoint $num, pck__foo__bar__minsym__2 \\(\\) at.*" \
         "run until breakpoint at BREAK"

gdb_test "continue" \
         "Breakpoint $num, main \\(\\) at.*"

gdb_test "print val" \
         " = 124"
