-# Copyright 2007, 2008, 2009 Free Software Foundation, Inc.
+# Copyright 2007-2018 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
#
# 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.
-# For now pick a sampling of likely targets.
-if {![istarget *-*-linux*]
- && ![istarget *-*-gnu*]
- && ![istarget *-*-elf*]
- && ![istarget *-*-openbsd*]
- && ![istarget arm-*-eabi*]
- && ![istarget powerpc-*-eabi*]} {
+if {![dwarf2_support]} {
return 0
}
-set testfile "dw2-noloc"
-set srcfile ${testfile}.S
-set binfile ${objdir}/${subdir}/${testfile}.x
-
-if { [gdb_compile "${srcdir}/${subdir}/main.c" "main.o" object {debug}] != "" } {
+if { [prepare_for_testing "failed to prepare" "dw2-noloc" {dw2-noloc-main.c dw2-noloc.S} {nodebug}] } {
return -1
}
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${testfile}.o" object {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.
+ }
}
-if { [gdb_compile "${testfile}.o main.o" "${binfile}" executable {debug}] != "" } {
+file_symbols no-run
+
+if ![runto_main] {
return -1
}
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
+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"
-gdb_test "print noloc" "Address of symbol \"noloc\" is unknown." "print noloc"
+# For `main_extern_locno_unresolvable' see `file_extern_locno_unresolvable'.