# 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]} {
    fail "couldn't run to 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"
