# Copyright 2020-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/>.

# Test the case where we have so many completions that we require the
# completions hash table within GDB to grow.  Make sure that afte the
# hash table has grown we try to add duplicate entries into the
# hash. This checks that GDB doesn't corrupt the hash table when
# resizing it.
#
# In this case we create a test with more functions than the default
# number of entires in the completion hash table (which is 200), then
# complete on all function names.
#
# GDB will add all the function names from the DWARF, and then from
# the ELF symbol table, this ensures that we should have duplicates
# added after resizing the table.

# Create a test source file and return the name of the file.  COUNT is
# the number of dummy functions to create, this should be more than
# the default number of entries in the completion hash table within
# GDB (see gdb/completer.c).
proc prepare_test_source_file { count } {
    global gdb_test_file_name

    set filename [standard_output_file "$gdb_test_file_name.c"]
    set outfile [open $filename w]

    puts $outfile "
#define MAKE_FUNC(NUM) \\
  void                 \\
  func_ ## NUM (void)  \\
  { /* Nothing.  */ }

#define CALL_FUNC(NUM) \\
  func_ ## NUM ()
"

    for { set i 0 } { $i < $count } { incr i } {
	puts $outfile "MAKE_FUNC ([format {%03d} $i])"
    }

    puts $outfile "\nint\nmain ()\n{"
    for { set i 0 } { $i < $count } { incr i } {
	puts $outfile "  CALL_FUNC ([format {%03d} $i]);"
    }

    puts $outfile "  return 0;\n}"
    close $outfile

    return $filename
}

# Build a source file and compile it.
set filename [prepare_test_source_file 250]
standard_testfile $filename
if {[prepare_for_testing "failed to prepare" "$testfile" $srcfile \
	 { debug }]} {
    return -1
}

# Start the test.
if {![runto_main]} {
    return
}

# We don't want to stop gathering completions too early.
gdb_test_no_output "set max-completions unlimited"

# Collect all possible completions, and check for duplictes.
set completions [capture_command_output "complete break func_" ""]
set duplicates 0
foreach {-> name} [regexp -all -inline -line {^break (\w+\S*)} $completions] {
    incr all_funcs($name)
    if { $all_funcs($name) > 1 } {
	incr duplicates
	verbose -log "Duplicate entry for '$name' found"
    }
}
gdb_assert { $duplicates == 0 } "duplicate check"
