Commit | Line | Data |
---|---|---|
88b9d363 | 1 | # Copyright 2018-2022 Free Software Foundation, Inc. |
eb77c9df AB |
2 | |
3 | # This program is free software; you can redistribute it and/or modify | |
4 | # it under the terms of the GNU General Public License as published by | |
5 | # the Free Software Foundation; either version 3 of the License, or | |
6 | # (at your option) any later version. | |
7 | # | |
8 | # This program is distributed in the hope that it will be useful, | |
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | # GNU General Public License for more details. | |
12 | # | |
13 | # You should have received a copy of the GNU General Public License | |
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
15 | ||
16 | # This tests some non-standard DWARF spotted in an Intel C Compiler | |
17 | # generated binary. | |
18 | # | |
19 | # The DWARF standard (V5 3.3.2) says that a void C function should not | |
20 | # have a DW_AT_type attribute, however, an ICC compiled binary was | |
21 | # found to have a DW_AT_type that referenced a signed integer type, of | |
22 | # size 0, with the name 'void'. | |
23 | # | |
24 | # This 'void' integer type would cause GDB to crash in some cases, one | |
25 | # that was seen was when using 'finish' to leave the void function. | |
26 | ||
27 | load_lib dwarf.exp | |
28 | ||
29 | # This test can only be run on targets which support DWARF-2 and use gas. | |
30 | if {![dwarf2_support]} { | |
31 | return 0 | |
32 | } | |
33 | ||
d1c8a76d | 34 | standard_testfile .c .S |
eb77c9df AB |
35 | |
36 | # Make some DWARF for the test. | |
37 | set asm_file [standard_output_file $srcfile2] | |
38 | Dwarf::assemble $asm_file { | |
9476b583 TV |
39 | global srcfile |
40 | ||
eb77c9df AB |
41 | cu {} { |
42 | DW_TAG_compile_unit { | |
43 | {DW_AT_producer "Intel(R) C Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 14.0.5.212 Build 20150212"} | |
44 | {DW_AT_language @DW_LANG_C} | |
9476b583 | 45 | {DW_AT_name $srcfile} |
eb77c9df AB |
46 | {DW_AT_comp_dir /tmp} |
47 | } { | |
35ee2dc2 | 48 | declare_labels int_type void_type ptr_type |
eb77c9df | 49 | |
35ee2dc2 | 50 | int_type: DW_TAG_base_type { |
eb77c9df AB |
51 | {DW_AT_byte_size 4 DW_FORM_sdata} |
52 | {DW_AT_encoding @DW_ATE_signed} | |
53 | {DW_AT_name int} | |
54 | } | |
55 | ||
35ee2dc2 | 56 | void_type: DW_TAG_base_type { |
eb77c9df AB |
57 | {DW_AT_byte_size 0 DW_FORM_sdata} |
58 | {DW_AT_encoding @DW_ATE_signed} | |
59 | {DW_AT_name void} | |
60 | } | |
61 | ||
62 | ptr_type: DW_TAG_pointer_type { | |
35ee2dc2 | 63 | {DW_AT_type :$void_type} |
eb77c9df AB |
64 | } |
65 | ||
66 | DW_TAG_subprogram { | |
90c3ec2d | 67 | {MACRO_AT_func {func}} |
35ee2dc2 | 68 | {type :$void_type} |
eb77c9df AB |
69 | } |
70 | DW_TAG_subprogram { | |
90c3ec2d | 71 | {MACRO_AT_func {main}} |
35ee2dc2 | 72 | {type :$int_type} |
eb77c9df AB |
73 | } |
74 | ||
75 | DW_TAG_variable { | |
76 | {DW_AT_name "var_a"} | |
77 | {DW_AT_type :$int_type} | |
78 | {DW_AT_external 1 DW_FORM_flag} | |
79 | {DW_AT_location {DW_OP_addr [gdb_target_symbol "var_a"]} SPECIAL_expr} | |
80 | } | |
81 | ||
82 | DW_TAG_variable { | |
83 | {DW_AT_name "var_ptr"} | |
84 | {DW_AT_type :$ptr_type} | |
85 | {DW_AT_external 1 DW_FORM_flag} | |
86 | {DW_AT_location {DW_OP_addr [gdb_target_symbol "var_ptr"]} SPECIAL_expr} | |
87 | } | |
88 | } | |
89 | } | |
90 | } | |
91 | ||
92 | if { [prepare_for_testing "failed to prepare" ${testfile} \ | |
93 | [list $srcfile $asm_file] {nodebug}] } { | |
94 | return -1 | |
95 | } | |
96 | ||
97 | if ![runto_main] { | |
98 | return -1 | |
99 | } | |
100 | ||
101 | # Place a breakpoint in 'func' and continue to there. | |
102 | gdb_breakpoint func | |
103 | gdb_continue_to_breakpoint "func" | |
104 | ||
105 | # Check how GDB handles the void* variable. | |
106 | gdb_test "p *var_ptr" "Attempt to dereference a generic pointer." \ | |
107 | "check that dereferencing a void* gives a suitable message" | |
108 | ||
109 | # Now finish, returning to main. | |
110 | gdb_test "finish" [multi_line \ | |
111 | "Run till exit from #0 $hex in func \\\(\\\)" \ | |
112 | "$hex in main \\\(\\\)"] \ | |
113 | "check that finish completes" |