# Copyright 2007, 2008, 2009 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# This file is part of the gdb testsuite.

if $tracelevel then {
    strace $tracelevel
}

# It's possible to have a program that contains two compilation units
# for the same source file name, that have code at different lines.
# For example, in this test, we compile expand-psymtabs.c twice with
# different preprocessor symbols #defined; the first .o only has
# 'main' at some earlier source lines, while the second .o only has
# 'foo' at later source lines.  So when setting breakpoints by line
# number, which full symtab we need depends on the line number in
# question.
#
# This test is meant to verify that, even with lazy partial symtab
# reading in effect, GDB can set breakpoints by line number
# successfully in either compilation unit.  

set testfile expand-psymtabs
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
set binfile_1 ${objdir}/${subdir}/${testfile}_1.o
set binfile_2 ${objdir}/${subdir}/${testfile}_2.o

# What compiler are we using?
if [get_compiler_info ${binfile}] {
    return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile_1}" object {debug additional_flags=-DFIRST} ] != "" } {
     untested expand-psymtabs.exp
     return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile_2}" object {debug}] != "" } {
     untested expand-psymtabs.exp
     return -1
}

if  { [gdb_compile "${binfile_1} ${binfile_2}" "${binfile}" executable {debug}] != "" } {
     untested expand-psymtabs.exp
     return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

set foo_bp [gdb_get_line_number "Break here"]
gdb_test "break $foo_bp" "Breakpoint.*" "Expand psymtabs"

