mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-11-16 12:34:43 +00:00
This patch introduces a new macro, INIT_GDB_FILE. This is used to
replace the current "_initialize_" idiom when introducing a per-file
initialization function. That is, rather than write:
void _initialize_something ();
void
_initialize_something ()
{
...
}
... now you would write:
INIT_GDB_FILE (something)
{
...
}
The macro handles both the declaration and definition of the function.
The point of this approach is that it makes it harder to accidentally
cause an initializer to be omitted; see commit 2711e475 ("Ensure
cooked_index_entry self-tests are run"). Specifically, the regexp now
used by make-init-c seems harder to trick.
New in v2: un-did some erroneous changes made by the script.
The bulk of this patch was written by script.
Regression tested on x86-64 Fedora 41.
73 lines
2.3 KiB
Bash
Executable File
73 lines
2.3 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Copyright (C) 2013-2025 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/>.
|
|
|
|
# Generate the init.c source file.
|
|
#
|
|
# Usage:
|
|
#
|
|
# ./make-init-c source-files > init.c-tmp
|
|
#
|
|
# Where SOURCE-FILES is the list of source files to extract init functions from.
|
|
#
|
|
|
|
# An initialization function is introduced using the "INIT_GDB_FILE"
|
|
# macro. In ordinary code this expands to a function declaration (to
|
|
# avoid a warning) and then the start of a definition. In the
|
|
# generated init.c, though, it is expanded differently. For example:
|
|
#
|
|
# INIT_GDB_FILE (foo)
|
|
# {
|
|
# ...
|
|
# }
|
|
#
|
|
|
|
# Abort on command error.
|
|
set -e
|
|
|
|
echo "/* Do not modify this file. */"
|
|
echo "/* It is created automatically by the Makefile. */"
|
|
echo "#include <algorithm>"
|
|
echo ""
|
|
echo "#undef INIT_GDB_FILE"
|
|
echo "#define INIT_GDB_FILE(NAME) extern void _initialize_ ## NAME ();"
|
|
grep -h '^[ ]*INIT_GDB_FILE\b' "$@"
|
|
echo ""
|
|
echo "void initialize_all_files ();"
|
|
echo "void"
|
|
echo "initialize_all_files ()"
|
|
echo "{"
|
|
echo " typedef void initialize_file_ftype (void);"
|
|
echo ""
|
|
echo " std::vector<initialize_file_ftype *> functions ="
|
|
echo " {"
|
|
echo "#undef INIT_GDB_FILE"
|
|
echo "#define INIT_GDB_FILE(NAME) _initialize_ ## NAME,"
|
|
grep -h '^[ ]*INIT_GDB_FILE\b' "$@"
|
|
echo " };"
|
|
echo ""
|
|
echo " /* If GDB_REVERSE_INIT_FUNCTIONS is set (any value), reverse the"
|
|
echo " order in which initialization functions are called. This is"
|
|
echo " used by the testsuite. */"
|
|
echo " if (getenv (\"GDB_REVERSE_INIT_FUNCTIONS\") != nullptr)"
|
|
echo " std::reverse (functions.begin (), functions.end ());"
|
|
echo ""
|
|
echo " for (initialize_file_ftype *function : functions)"
|
|
echo " function ();"
|
|
echo "}"
|