# Test macro handling of #included files.
# Copyright 2003-2021 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 "failed to compile"
    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 -q 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)"
            }
        }
    }
}
