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

# 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.
if {![dwarf2_support]} {
    verbose "Skipping DW_AT_ranges test."
    return 0  
}

# The .c files use __attribute__.
if [get_compiler_info unused] {
    return -1;
}
if !$gcc_compiled {
    verbose "Skipping DW_AT_ranges test."
    return 0  
}

set testfile "dw2-ranges"
set srcfile ${testfile}.c
set srcfile2 ${testfile}2.c
set srcfile3 ${testfile}3.c
set asmfile ${objdir}/${subdir}/${testfile}.s
set asmfile2 ${objdir}/${subdir}/${testfile}2.s
set asmfile3 ${objdir}/${subdir}/${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}

# Generate .s without debug info but provide debug info by the assembler.
# This way we get DW_TAG_compile_unit DIE and only that DIE.

if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${asmfile}" assembly {}] != ""
    || [gdb_compile "${asmfile}" "${objfile}" object {additional_flags=-gdwarf-2}] != "" } {
    return -1
}
if {[gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${asmfile2}" assembly {}] != ""
    || [gdb_compile "${asmfile2}" "${objfile2}" object {additional_flags=-gdwarf-2}] != "" } {
    return -1
}

# STABS compilation is intentional as it tests the STABS lookup where is no
# partial_symtab->psymtabs_addrmap supported for that CU (Compilation Unit) in
# a file containing psymtabs_addrmap-supporting DWARF CUs.
if {[gdb_compile "${srcdir}/${subdir}/${srcfile3}" "${asmfile3}" assembly {}] != ""
    || [gdb_compile "${asmfile3}" "${objfile3}" object {additional_flags=-gstabs}] != "" } {
    return -1
}

if {[gdb_compile "${objfile} ${objfile2} ${objfile3}" "${binfile}" executable {}] != "" } {
    return -1
}

clean_restart ${testfile}

# 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 .*"

set test "info line main3"
gdb_test_multiple $test $test {
    -re "Line \[0-9\]* of .* starts at address .* and ends at .*\r\n$gdb_prompt $" {
	pass $test
    }
    -re "Line \[0-9\]* of .* is at address .* but contains no code\\.\r\n$gdb_prompt $" {
	kfail symtab/12497 $test
    }
}
