# Copyright 2007-2012 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/>.

if [using_clang] {
  untested "Clang does not guarantee ordering of inline asm relative to functions"
  return -1
}

load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
    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} { with_test_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" "= <optimized out>"
    gdb_test "ptype file_locempty_resolvable" "type = int"

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

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

    gdb_test "print file_locno_unresolvable" "= <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" "= <optimized out>"
    gdb_test "ptype file_extern_locempty_resolvable" "type = int"

    gdb_test "print file_extern_locempty_unresolvable" "= <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 <optimized out>.  As usefulness of such DIE is not
    # clear its resolution is not being tested.
}}

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" "= <optimized out>"
gdb_test "ptype main_local_locempty_resolvable" "type = int"

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

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

gdb_test "print main_local_locno_unresolvable" "= <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" "= <optimized out>"
gdb_test "ptype main_extern_locempty_resolvable" "type = int"

gdb_test "print main_extern_locempty_unresolvable" "= <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'.
