# 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, see <http://www.gnu.org/licenses/>.

# 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*]} {
    return 0  
}

if { [prepare_for_testing dw2-noloc.exp "dw2-noloc" {dw2-noloc-main.c dw2-noloc.S} {nodebug}] } {
    return -1
}

# Symbols have the form: {file,main}_loc{addr,empty,no}_{,un}resolvable
# file: Symbol DIE is placed in DW_TAG_compile_unit.
# main: Symbol DIE is placed in DW_TAG_subprogram.
# locaddr: DW_AT_location is using DW_FORM_block DW_OP_addr <addr>.
# locempty: DW_AT_location has zero DW_FORM_block size.
# locno: DW_AT_location is not present.
# resolvable: .symtab entry exists for this symbol name.
# unresolvable: .symtab entry does not exist for this symbol name.
# DW_AT_declaration is not present in any of these DIEs.

proc file_symbols {type} {
    global pf_prefix
    set old_prefix $pf_prefix
    lappend pf_prefix "$type:"

    global gdb_prompt

    gdb_test "print file_locaddr_resolvable" "= 1234567890"
    gdb_test "ptype file_locaddr_resolvable" "type = int"

    gdb_test "print file_locaddr_unresolvable" "= 1234567890"
    gdb_test "ptype file_locaddr_unresolvable" "type = int"

    gdb_test "print file_locempty_resolvable" "= <value optimized out>"
    gdb_test "ptype file_locempty_resolvable" "type = int"

    gdb_test "print file_locempty_unresolvable" "= <value optimized out>"
    gdb_test "ptype file_locempty_unresolvable" "type = int"

    gdb_test "print file_locno_resolvable" "= <value optimized out>"
    gdb_test "ptype file_locno_resolvable" "type = int"

    gdb_test "print file_locno_unresolvable" "= <value optimized out>"
    gdb_test "ptype file_locno_unresolvable" "type = int"

    gdb_test "print file_extern_locaddr_resolvable" "= 1234567890"
    gdb_test "ptype file_extern_locaddr_resolvable" "type = int"

    gdb_test "print file_extern_locaddr_unresolvable" "= 1234567890"
    gdb_test "ptype file_extern_locaddr_unresolvable" "type = int"

    gdb_test "print file_extern_locempty_resolvable" "= <value optimized out>"
    gdb_test "ptype file_extern_locempty_resolvable" "type = int"

    gdb_test "print file_extern_locempty_unresolvable" "= <value optimized out>"
    gdb_test "ptype file_extern_locempty_unresolvable" "type = int"

    gdb_test "print file_extern_locno_resolvable" "= 1234567890"
    gdb_test "ptype file_extern_locno_resolvable" "type = int"

    # `print file_extern_locno_unresolvable' currently prints
    # Address of symbol "file_extern_locno_unresolvable" is unknown.
    # As DW_AT_declaration is not present in this DIE
    # it should print <value optimized out>.  As usefulness of such DIE is not
    # clear its resolution is not being tested.

    set pf_prefix $old_prefix
}

file_symbols no-run

if ![runto_main] {
    return -1
}

file_symbols in-main


gdb_test "print main_local_locaddr_resolvable" "= 1234567890"
gdb_test "ptype main_local_locaddr_resolvable" "type = int"

gdb_test "print main_local_locaddr_unresolvable" "= 1234567890"
gdb_test "ptype main_local_locaddr_unresolvable" "type = int"

gdb_test "print main_local_locempty_resolvable" "= <value optimized out>"
gdb_test "ptype main_local_locempty_resolvable" "type = int"

gdb_test "print main_local_locempty_unresolvable" "= <value optimized out>"
gdb_test "ptype main_local_locempty_unresolvable" "type = int"

gdb_test "print main_local_locno_resolvable" "= <value optimized out>"
gdb_test "ptype main_local_locno_resolvable" "type = int"

gdb_test "print main_local_locno_unresolvable" "= <value optimized out>"
gdb_test "ptype main_local_locno_unresolvable" "type = int"

gdb_test "print main_extern_locaddr_resolvable" "= 1234567890"
gdb_test "ptype main_extern_locaddr_resolvable" "type = int"

gdb_test "print main_extern_locaddr_unresolvable" "= 1234567890"
gdb_test "ptype main_extern_locaddr_unresolvable" "type = int"

gdb_test "print main_extern_locempty_resolvable" "= <value optimized out>"
gdb_test "ptype main_extern_locempty_resolvable" "type = int"

gdb_test "print main_extern_locempty_unresolvable" "= <value optimized out>"
gdb_test "ptype main_extern_locempty_unresolvable" "type = int"

gdb_test "print main_extern_locno_resolvable" "= 1234567890"
gdb_test "ptype main_extern_locno_resolvable" "type = int"

# For `main_extern_locno_unresolvable' see `file_extern_locno_unresolvable'.
