binutils-gdb/gdb/unittests/command-def-selftests.c
Simon Marchi 6bd434d6ca gdb: make some variables static
I'm trying to enable clang's -Wmissing-variable-declarations warning.
This patch fixes all the obvious spots where we can simply add "static"
(at least, found when building on x86-64 Linux).

gdb/ChangeLog:

	* aarch64-linux-tdep.c (aarch64_linux_record_tdep): Make static.
	* aarch64-tdep.c (tdesc_aarch64_list, aarch64_prologue_unwind,
	aarch64_stub_unwind, aarch64_normal_base, ): Make static.
	* arm-linux-tdep.c (arm_prologue_unwind): Make static.
	* arm-tdep.c (struct frame_unwind): Make static.
	* auto-load.c (auto_load_safe_path_vec): Make static.
	* csky-tdep.c (csky_stub_unwind): Make static.
	* gdbarch.c (gdbarch_data_registry): Make static.
	* gnu-v2-abi.c (gnu_v2_abi_ops): Make static.
	* i386-netbsd-tdep.c (i386nbsd_mc_reg_offset): Make static.
	* i386-tdep.c (i386_frame_setup_skip_insns,
	i386_tramp_chain_in_reg_insns, i386_tramp_chain_on_stack_insns):
	Make static.
	* infrun.c (observer_mode): Make static.
	* linux-nat.c (sigchld_action): Make static.
	* linux-thread-db.c (thread_db_list): Make static.
	* maint-test-options.c (maintenance_test_options_list):
	* mep-tdep.c (mep_csr_registers): Make static.
	* mi/mi-cmds.c (struct mi_cmd_stats): Remove struct type name.
	(stats): Make static.
	* nat/linux-osdata.c (struct osdata_type): Make static.
	* ppc-netbsd-tdep.c (ppcnbsd_reg_offsets): Make static.
	* progspace.c (last_program_space_num): Make static.
	* python/py-param.c (struct parm_constant): Remove struct type
	name.
	(parm_constants): Make static.
	* python/py-record-btrace.c (btpy_list_methods): Make static.
	* python/py-record.c (recpy_gap_type): Make static.
	* record.c (record_goto_cmdlist): Make static.
	* regcache.c (regcache_descr_handle): Make static.
	* registry.h (DEFINE_REGISTRY): Make definition static.
	* symmisc.c (std_in, std_out, std_err): Make static.
	* top.c (previous_saved_command_line): Make static.
	* tracepoint.c (trace_user, trace_notes, trace_stop_notes): Make
	static.
	* unittests/command-def-selftests.c (nr_duplicates,
	nr_invalid_prefixcmd, lists): Make static.
	* unittests/observable-selftests.c (test_notification): Make
	static.
	* unittests/optional/assignment/1.cc (counter): Make static.
	* unittests/optional/assignment/2.cc (counter): Make static.
	* unittests/optional/assignment/3.cc (counter): Make static.
	* unittests/optional/assignment/4.cc (counter): Make static.
	* unittests/optional/assignment/5.cc (counter): Make static.
	* unittests/optional/assignment/6.cc (counter): Make static.

gdbserver/ChangeLog:

	* ax.cc (bytecode_address_table): Make static.
	* debug.cc (debug_file): Make static.
	* linux-low.cc (stopping_threads): Make static.
	(step_over_bkpt): Make static.
	* linux-x86-low.cc (amd64_emit_ops, i386_emit_ops): Make static.
	* tracepoint.cc (stop_tracing_bkpt, flush_trace_buffer_bkpt,
	alloced_trace_state_variables, trace_buffer_ctrl,
	tracing_start_time, tracing_stop_time, tracing_user_name,
	tracing_notes, tracing_stop_note): Make static.

Change-Id: Ic1d8034723b7802502bda23770893be2338ab020
2021-01-20 20:55:05 -05:00

217 lines
6.1 KiB
C

/* Self tests for GDB command definitions for GDB, the GNU debugger.
Copyright (C) 2019-2021 Free Software Foundation, Inc.
This file is part of GDB.
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/>. */
#include "defs.h"
#include "cli/cli-cmds.h"
#include "cli/cli-decode.h"
#include "gdbsupport/selftest.h"
#include <map>
namespace selftests {
/* Verify some invariants of GDB commands documentation. */
namespace help_doc_tests {
static unsigned int nr_failed_invariants;
/* Report a broken invariant and increments nr_failed_invariants. */
static void
broken_doc_invariant (const char *prefix, const char *name, const char *msg)
{
fprintf_filtered (gdb_stdout,
"help doc broken invariant: command '%s%s' help doc %s\n",
prefix, name, msg);
nr_failed_invariants++;
}
/* Recursively walk the commandlist structures, and check doc invariants:
- The first line of the doc must end with a '.'.
- the doc must not end with a new line.
If an invariant is not respected, produce a message and increment
nr_failed_invariants.
Note that we do not call SELF_CHECK in this function, as we want
all commands to be checked before making the test fail. */
static void
check_doc (struct cmd_list_element *commandlist, const char *prefix)
{
struct cmd_list_element *c;
/* Walk through the commands. */
for (c = commandlist; c; c = c->next)
{
/* Checks the doc has a first line terminated with a '.'. */
const char *p = c->doc;
/* Position p on the first LF, or on terminating null byte. */
while (*p && *p != '\n')
p++;
if (p == c->doc)
broken_doc_invariant
(prefix, c->name,
"is missing the first line terminated with a '.' character");
else if (*(p-1) != '.')
broken_doc_invariant
(prefix, c->name,
"first line is not terminated with a '.' character");
/* Checks the doc is not terminated with a new line. */
if (c->doc[strlen (c->doc) - 1] == '\n')
broken_doc_invariant
(prefix, c->name,
"has a superfluous trailing end of line");
/* Check if this command has subcommands and is not an
abbreviation. We skip checking subcommands of abbreviations
in order to avoid duplicates in the output. */
if (c->prefixlist != NULL && !c->abbrev_flag)
{
/* Recursively call ourselves on the subcommand list,
passing the right prefix in. */
check_doc (*c->prefixlist, c->prefixname);
}
}
}
static void
help_doc_invariants_tests ()
{
nr_failed_invariants = 0;
check_doc (cmdlist, "");
SELF_CHECK (nr_failed_invariants == 0);
}
} /* namespace help_doc_tests */
/* Verify some invariants of GDB command structure. */
namespace command_structure_tests {
/* Nr of commands in which a duplicated list is found. */
static unsigned int nr_duplicates = 0;
/* Nr of commands in a list having no valid prefix cmd. */
static unsigned int nr_invalid_prefixcmd = 0;
/* A map associating a list with the prefix leading to it. */
static std::map<cmd_list_element **, const char *> lists;
/* Store each command list in lists, associated with the prefix to reach it. A
list must only be found once.
Verifies that all elements of the list have the same non-null prefix
command. */
static void
traverse_command_structure (struct cmd_list_element **list,
const char *prefix)
{
struct cmd_list_element *c, *prefixcmd;
auto dupl = lists.find (list);
if (dupl != lists.end ())
{
fprintf_filtered (gdb_stdout,
"list %p duplicated,"
" reachable via prefix '%s' and '%s'."
" Duplicated list first command is '%s'\n",
list,
prefix, dupl->second,
(*list)->name);
nr_duplicates++;
return;
}
lists.insert ({list, prefix});
/* All commands of *list must have a prefix command equal to PREFIXCMD,
the prefix command of the first command. */
if (*list == nullptr)
prefixcmd = nullptr; /* A prefix command with an empty subcommand list. */
else
prefixcmd = (*list)->prefix;
/* Walk through the commands. */
for (c = *list; c; c = c->next)
{
/* If this command has subcommands and is not an alias,
traverse the subcommands. */
if (c->prefixlist != NULL && c->cmd_pointer == nullptr)
{
/* Recursively call ourselves on the subcommand list,
passing the right prefix in. */
traverse_command_structure (c->prefixlist, c->prefixname);
}
if (prefixcmd != c->prefix
|| (prefixcmd == nullptr && *list != cmdlist))
{
if (c->prefix == nullptr)
fprintf_filtered (gdb_stdout,
"list %p reachable via prefix '%s'."
" command '%s' has null prefixcmd\n",
list,
prefix, c->name);
else
fprintf_filtered (gdb_stdout,
"list %p reachable via prefix '%s'."
" command '%s' has a different prefixcmd\n",
list,
prefix, c->name);
nr_invalid_prefixcmd++;
}
}
}
/* Verify that a list of commands is present in the tree only once. */
static void
command_structure_invariants_tests ()
{
nr_duplicates = 0;
nr_invalid_prefixcmd = 0;
traverse_command_structure (&cmdlist, "");
/* Release memory, be ready to be re-run. */
lists.clear ();
SELF_CHECK (nr_duplicates == 0);
SELF_CHECK (nr_invalid_prefixcmd == 0);
}
}
} /* namespace selftests */
void _initialize_command_def_selftests ();
void
_initialize_command_def_selftests ()
{
selftests::register_test
("help_doc_invariants",
selftests::help_doc_tests::help_doc_invariants_tests);
selftests::register_test
("command_structure_invariants",
selftests::command_structure_tests::command_structure_invariants_tests);
}