# Copyright 2007-2024 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 . load_lib dwarf.exp # This test can only be run on targets which support DWARF-2 and use gas. require dwarf2_support standard_testfile .c .S set asm_file [standard_output_file $srcfile2] Dwarf::assemble $asm_file { global srcdir subdir srcfile srcfile2 declare_labels lines_label get_func_info main cu {} { compile_unit { {language @DW_LANG_C} {name $srcfile} {stmt_list ${lines_label} DW_FORM_sec_offset} } { declare_labels integer_label set int_size [get_sizeof "int" 4] integer_label: DW_TAG_base_type { {DW_AT_byte_size $int_size DW_FORM_sdata} {DW_AT_encoding @DW_ATE_signed} {DW_AT_name int} } DW_TAG_subprogram { {external 1 flag} {name main} {low_pc $main_start addr} {high_pc "$main_start + $main_len" addr} } DW_TAG_variable { {DW_AT_name file_locno_resolvable} {DW_AT_type :$integer_label} } DW_TAG_variable { {DW_AT_name file_locno_unresolvable} {DW_AT_type :$integer_label} } DW_TAG_variable { {DW_AT_name file_locempty_resolvable} {DW_AT_type :$integer_label} {DW_AT_location {} DW_FORM_block1} } DW_TAG_variable { {DW_AT_name file_locempty_unresolvable} {DW_AT_type :$integer_label} {DW_AT_location {} DW_FORM_block1} } DW_TAG_variable { {DW_AT_name file_locaddr_resolvable} {DW_AT_type :$integer_label} {DW_AT_location { DW_OP_addr [gdb_target_symbol file_locaddr_resolvable] } SPECIAL_expr} } DW_TAG_variable { {DW_AT_name file_locaddr_unresolvable} {DW_AT_type :$integer_label} {DW_AT_location { DW_OP_addr [gdb_target_symbol file_locaddr_resolvable] } SPECIAL_expr} } DW_TAG_variable { {DW_AT_name file_extern_locno_resolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} } DW_TAG_variable { {DW_AT_name file_extern_locno_unresolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} } DW_TAG_variable { {DW_AT_name file_extern_locempty_resolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} {DW_AT_location {} DW_FORM_block1} } DW_TAG_variable { {DW_AT_name file_extern_locempty_unresolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} {DW_AT_location {} DW_FORM_block1} } DW_TAG_variable { {DW_AT_name file_extern_locaddr_resolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} {DW_AT_location { DW_OP_addr [gdb_target_symbol file_extern_locaddr_resolvable] } SPECIAL_expr} } DW_TAG_variable { {DW_AT_name file_extern_locaddr_unresolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} {DW_AT_location { DW_OP_addr [gdb_target_symbol file_extern_locaddr_resolvable] } SPECIAL_expr} } DW_TAG_variable { {DW_AT_name main_local_locno_resolvable} {DW_AT_type :$integer_label} } DW_TAG_variable { {DW_AT_name main_local_locno_unresolvable} {DW_AT_type :$integer_label} } DW_TAG_variable { {DW_AT_name main_local_locempty_resolvable} {DW_AT_type :$integer_label} {DW_AT_location {} DW_FORM_block1} } DW_TAG_variable { {DW_AT_name main_local_locempty_unresolvable} {DW_AT_type :$integer_label} {DW_AT_location {} DW_FORM_block1} } DW_TAG_variable { {DW_AT_name main_local_locaddr_resolvable} {DW_AT_type :$integer_label} {DW_AT_location { DW_OP_addr [gdb_target_symbol main_local_locaddr_resolvable] } SPECIAL_expr} } DW_TAG_variable { {DW_AT_name main_local_locaddr_unresolvable} {DW_AT_type :$integer_label} {DW_AT_location { DW_OP_addr [gdb_target_symbol main_local_locaddr_resolvable] } SPECIAL_expr} } DW_TAG_variable { {DW_AT_name main_extern_locno_resolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} } DW_TAG_variable { {DW_AT_name main_extern_locno_unresolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} } DW_TAG_variable { {DW_AT_name main_extern_locempty_resolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} {DW_AT_location {} DW_FORM_block1} } DW_TAG_variable { {DW_AT_name main_extern_locempty_unresolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} {DW_AT_location {} DW_FORM_block1} } DW_TAG_variable { {DW_AT_name main_extern_locaddr_resolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} {DW_AT_location { DW_OP_addr [gdb_target_symbol main_extern_locaddr_resolvable] } SPECIAL_expr} } DW_TAG_variable { {DW_AT_name main_extern_locaddr_unresolvable} {DW_AT_type :$integer_label} {DW_AT_external 1 flag} {DW_AT_location { DW_OP_addr [gdb_target_symbol main_extern_locaddr_resolvable] } SPECIAL_expr} } } } lines {version 5} lines_label { set diridx [include_dir "${srcdir}/${subdir}"] file_name "$srcfile" $diridx program { DW_LNS_set_file $diridx DW_LNE_set_address $main_start line [gdb_get_line_number "main start"] DW_LNS_set_prologue_end DW_LNS_copy DW_LNE_set_address $main_end DW_LNE_end_sequence } } } if { [prepare_for_testing "failed to prepare" ${testfile} [list $srcfile $asm_file] {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 . # 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" "= " gdb_test "ptype file_locempty_resolvable" "type = int" gdb_test "print file_locempty_unresolvable" "= " gdb_test "ptype file_locempty_unresolvable" "type = int" gdb_test "print file_locno_resolvable" "= " gdb_test "ptype file_locno_resolvable" "type = int" gdb_test "print file_locno_unresolvable" "= " 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" "= " gdb_test "ptype file_extern_locempty_resolvable" "type = int" gdb_test "print file_extern_locempty_unresolvable" "= " 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 . 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" "= " gdb_test "ptype main_local_locempty_resolvable" "type = int" gdb_test "print main_local_locempty_unresolvable" "= " gdb_test "ptype main_local_locempty_unresolvable" "type = int" gdb_test "print main_local_locno_resolvable" "= " gdb_test "ptype main_local_locno_resolvable" "type = int" gdb_test "print main_local_locno_unresolvable" "= " 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" "= " gdb_test "ptype main_extern_locempty_resolvable" "type = int" gdb_test "print main_extern_locempty_unresolvable" "= " 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'.