# Copyright 2007-2020 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

# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
    return 0  
}

if { [prepare_for_testing "failed to prepare" "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'.
