1# Test macro handling of #included files. 2# Copyright 2003 Free Software Foundation, Inc. 3 4# This program is free software; you can redistribute it and/or modify 5# it under the terms of the GNU General Public License as published by 6# the Free Software Foundation; either version 2 of the License, or 7# (at your option) any later version. 8# 9# This program is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# 14# You should have received a copy of the GNU General Public License 15# along with this program; if not, write to the Free Software 16# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 18# Please email any bugs, comments, and/or additions to this file to: 19# bug-gdb@prep.ai.mit.edu 20 21# The test program lineinc.c contains a mix of #line directives and 22# #include directives that will cause the compiler to attribute more 23# than one #inclusion to the same source line. You can get similar 24# effects using things like GCC's '-imacros' flag. 25# 26# Compiling lineinc.c with Dwarf 2 macro information will produce 27# something like this: 28# 29# $ gcc -g3 lineinc.c -o lineinc 30# $ readelf -wml lineinc 31# ... 32# The File Name Table: 33# Entry Dir Time Size Name 34# 1 0 0 0 lineinc.c 35# 2 0 0 0 lineinc1.h 36# 3 0 0 0 lineinc2.h 37# 4 0 0 0 lineinc3.h 38# ... 39# Contents of the .debug_macinfo section: 40# 41# DW_MACINFO_start_file - lineno: 0 filenum: 1 42# DW_MACINFO_define - lineno : 1 macro : __VERSION__ "3.2 20020903 (Red Hat Linux 8.0 3.2-7)" 43# DW_MACINFO_define - lineno : 2 macro : __USER_LABEL_PREFIX__ 44# ... 45# DW_MACINFO_define - lineno : 1 macro : __i386__ 1 46# DW_MACINFO_define - lineno : 1 macro : __tune_i386__ 1 47# DW_MACINFO_start_file - lineno: 10 filenum: 2 48# DW_MACINFO_define - lineno : 1 macro : FOO 1 49# DW_MACINFO_end_file 50# DW_MACINFO_start_file - lineno: 10 filenum: 3 51# DW_MACINFO_undef - lineno : 1 macro : FOO 52# DW_MACINFO_define - lineno : 2 macro : FOO 2 53# DW_MACINFO_end_file 54# DW_MACINFO_start_file - lineno: 11 filenum: 4 55# DW_MACINFO_undef - lineno : 1 macro : FOO 56# DW_MACINFO_define - lineno : 2 macro : FOO 3 57# DW_MACINFO_end_file 58# DW_MACINFO_end_file 59# $ 60# 61# Note how the inclusions of lineinc1.h and lineinc2.h are both 62# attributed to line 10 of lineinc.c, and the #inclusion of lineinc3.h 63# is attributed to line 11. This is all correct, given the #line 64# directives in lineinc.c. 65# 66# Dwarf 2 macro information doesn't contain enough information to 67# allow GDB to figure out what's really going on here --- it makes no 68# mention of the #line directives --- so we just try to cope as best 69# we can. If the macro table were to attribute more than one 70# #inclusion to the same source line, then GDB wouldn't be able to 71# tell which #included file's #definitions and #undefinitions come 72# first, so it can't tell which #definitions are in scope following 73# all the #inclusions. To cope with this, GDB puts all the files 74# #included by a given source file in a list sorted by the line at 75# which they were #included; this gives GDB the chance to detect 76# multiple #inclusions at the same line, complain, and assign 77# distinct, albiet incorrect, line numbers to each #inclusion. 78# 79# However, at one point GDB was sorting the list in reverse order, 80# while the code to assign new, distinct line numbers assumed it was 81# sorted in ascending order; GDB would get an internal error trying to 82# read the above debugging info. 83 84if $tracelevel then { 85 strace $tracelevel 86} 87 88set prms_id 0 89set bug_id 0 90 91set testfile "lineinc" 92set binfile ${objdir}/${subdir}/${testfile} 93 94 95if {[gdb_compile "${srcdir}/${subdir}/${testfile}.c" ${binfile} executable {debug}] != ""} { 96 gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." 97} 98 99gdb_exit 100gdb_start 101gdb_reinitialize_dir $srcdir/$subdir 102gdb_load ${binfile} 103 104# Any command that causes GDB to read the debugging info for the 105# lineinc.c compilation unit will do here. 106set test_name "tolerate macro info with multiple #inclusions per line" 107gdb_test_multiple "break main" $test_name { 108 -re "Breakpoint 1 at 0x.*: file .*lineinc.c.*\\.\r\n${gdb_prompt}" { 109 pass $test_name 110 } 111 -re ".*internal-error:.*.y or n. " { 112 fail $test_name 113 send_gdb "y\n" 114 gdb_expect { 115 -re ".*.y or n. " { 116 send_gdb "n\n" 117 exp_continue 118 } 119 -re "$gdb_prompt" { 120 } 121 timeout { 122 fail "$test_name (timeout)" 123 } 124 } 125 } 126} 127