# Copyright 2007, 2008, 2009, 2010 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/>.

# Test DW_TAG_compile_unit with no children and with neither DW_AT_low_pc nor
# DW_AT_high_pc but with DW_AT_ranges instead.

# This test can only be run on targets which support DWARF-2 and use gas.
# For now pick a sampling of likely targets.
if {![istarget *-*-linux*]
    && ![istarget *-*-gnu*]
    && ![istarget *-*-elf*]
    && ![istarget *-*-openbsd*]
    && ![istarget arm-*-eabi*]
    && ![istarget powerpc-*-eabi*]} {
    verbose "Skipping DW_AT_ranges test."
    return 0  
}

set testfile "dw2-ranges"
set srcfile ${testfile}.S
set srcfile2 ${testfile}2.S
set srcfile3 ${testfile}3.S
set objfile ${objdir}/${subdir}/${testfile}.o
set objfile2 ${objdir}/${subdir}/${testfile}2.o
set objfile3 ${objdir}/${subdir}/${testfile}3.o
set binfile ${objdir}/${subdir}/${testfile}

if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {additional_flags=-gdwarf-2}] != "" } {
    return -1
}
if {[gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${objfile2}" object {additional_flags=-gdwarf-2}] != "" } {
    return -1
}
if {[gdb_compile "${srcdir}/${subdir}/${srcfile3}" "${objfile3}" object {additional_flags=-gstabs}] != "" } {
    return -1
}
if {[gdb_compile "${objfile} ${objfile2} ${objfile3}" "${binfile}" executable {}] != "" } {
    return -1
}

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

# Test also objfile->psymtabs_addrmap relocations for -fPIE -pie builds below.
# On some targets it may possibly fail but the program is being started only
# for the PIE build so try it anyway.

runto_main

# Correct output:
# 	Line 39 of "../.././gdb/testsuite/gdb.dwarf2/dw2-ranges.S" starts at address 0x4 and ends at 0x8.
# Wrong output:
# 	No line number information available for address 0x4

gdb_test "info line main" "Line \[0-9\]* of .* starts at address .* and ends at .*"
gdb_test "info line func" "Line \[0-9\]* of .* starts at address .* and ends at .*"
gdb_test "info line main2" "Line \[0-9\]* of .* starts at address .* and ends at .*"
gdb_test "info line func2" "Line \[0-9\]* of .* starts at address .* and ends at .*"
gdb_test "info line main3" "Line \[0-9\]* of .* starts at address .* and ends at .*"
