# Test macro handling of #included files.
# Copyright 2003-2013 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/>.

# The test program lineinc.c contains a mix of #line directives and
# #include directives that will cause the compiler to attribute more
# than one #inclusion to the same source line.  You can get similar
# effects using things like GCC's '-imacros' flag.
#
# Compiling lineinc.c with Dwarf 2 macro information will produce
# something like this:
# 
#     $ gcc -g3 lineinc.c -o lineinc
#     $ readelf -wml lineinc
#     ...
#      The File Name Table:
#       Entry	Dir	Time	Size	Name
#       1	0	0	0	lineinc.c
#       2	0	0	0	lineinc1.h
#       3	0	0	0	lineinc2.h
#       4	0	0	0	lineinc3.h
#     ...
#     Contents of the .debug_macinfo section:
#     
#      DW_MACINFO_start_file - lineno: 0 filenum: 1
#      DW_MACINFO_define - lineno : 1 macro : __VERSION__ "3.2 20020903 (Red Hat Linux 8.0 3.2-7)"
#      DW_MACINFO_define - lineno : 2 macro : __USER_LABEL_PREFIX__ 
#     ...
#      DW_MACINFO_define - lineno : 1 macro : __i386__ 1
#      DW_MACINFO_define - lineno : 1 macro : __tune_i386__ 1
#      DW_MACINFO_start_file - lineno: 10 filenum: 2
#      DW_MACINFO_define - lineno : 1 macro : FOO 1
#      DW_MACINFO_end_file
#      DW_MACINFO_start_file - lineno: 10 filenum: 3
#      DW_MACINFO_undef - lineno : 1 macro : FOO
#      DW_MACINFO_define - lineno : 2 macro : FOO 2
#      DW_MACINFO_end_file
#      DW_MACINFO_start_file - lineno: 11 filenum: 4
#      DW_MACINFO_undef - lineno : 1 macro : FOO
#      DW_MACINFO_define - lineno : 2 macro : FOO 3
#      DW_MACINFO_end_file
#      DW_MACINFO_end_file
#     $   
#
# Note how the inclusions of lineinc1.h and lineinc2.h are both
# attributed to line 10 of lineinc.c, and the #inclusion of lineinc3.h
# is attributed to line 11.  This is all correct, given the #line
# directives in lineinc.c.
#
# Dwarf 2 macro information doesn't contain enough information to
# allow GDB to figure out what's really going on here --- it makes no
# mention of the #line directives --- so we just try to cope as best
# we can.  If the macro table were to attribute more than one
# #inclusion to the same source line, then GDB wouldn't be able to
# tell which #included file's #definitions and #undefinitions come
# first, so it can't tell which #definitions are in scope following
# all the #inclusions.  To cope with this, GDB puts all the files
# #included by a given source file in a list sorted by the line at
# which they were #included; this gives GDB the chance to detect
# multiple #inclusions at the same line, complain, and assign
# distinct, albiet incorrect, line numbers to each #inclusion.
#
# However, at one point GDB was sorting the list in reverse order,
# while the code to assign new, distinct line numbers assumed it was
# sorted in ascending order; GDB would get an internal error trying to
# read the above debugging info.


standard_testfile .c

if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" ${binfile} executable {debug}] != ""} {
    untested lineinc.exp
    return -1
}

clean_restart ${binfile}

# Any command that causes GDB to read the debugging info for the
# lineinc.c compilation unit will do here.
set test_name "tolerate macro info with multiple #inclusions per line"
gdb_test_multiple "break main" $test_name {
    -re "Breakpoint 1 at 0x.*: file .*lineinc.c.*\\.\r\n${gdb_prompt}" {
        pass $test_name
    }
    -re ".*internal-error:.*.y or n. " {
        fail $test_name
        send_gdb "y\n"
        gdb_expect {
            -re ".*.y or n. " {
                send_gdb "n\n"
                exp_continue
            }
            -re "$gdb_prompt" {
            }                
            timeout {
                fail "$test_name (timeout)"
            }
        }
    }
}
