791b7405f4
With the removal of the old VEC mechanism from the code base, update comments that still make reference to VECs. There should be no user visible changes after this commit. gdb/ChangeLog: * linespec.c (decode_digits_ordinary): Update comment. * make-target-delegates: No longer need to handle VEC case. * memrange.c (normalize_mem_ranges): Update comment. * namespace.c (add_using_directive): Update comment. * objc-lang.c (uniquify_strings): Update comment. * ppc-linux-nat.c (struct thread_points): Update comment. * probe.h (find_probes_in_objfile): Update comment. * target.h (enum flash_preserve_mode): Update comment. * varobj.c (varobj_restrict_range): Update comment. * varobj.h (varobj_list_children): Update comment. Change-Id: Iefd2e903705c3e79cd13b43395c7a1c167f9a088
422 lines
10 KiB
Perl
Executable File
422 lines
10 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
# Copyright (C) 2013-2019 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/>.
|
|
|
|
|
|
# Usage:
|
|
# make-target-delegates target.h > target-delegates.c
|
|
|
|
# The line we search for in target.h that marks where we should start
|
|
# looking for methods.
|
|
$TRIGGER = qr,^struct target_ops$,;
|
|
# The end of the methods part.
|
|
$ENDER = qr,^\s*};$,;
|
|
|
|
# Match a C symbol.
|
|
$SYMBOL = qr,[a-zA-Z_][a-zA-Z0-9_]*,;
|
|
# Match the name part of a method in struct target_ops.
|
|
$NAME_PART = qr,(?<name>${SYMBOL}+)\s,;
|
|
# Match the arguments to a method.
|
|
$ARGS_PART = qr,(?<args>\(.*\)),;
|
|
# We strip the indentation so here we only need the caret.
|
|
$INTRO_PART = qr,^,;
|
|
|
|
$POINTER_PART = qr,\s*(\*)?\s*,;
|
|
|
|
# Match a C++ symbol, including scope operators and template
|
|
# parameters. E.g., 'std::vector<something>'.
|
|
$CP_SYMBOL = qr,[a-zA-Z_][a-zA-Z0-9_<>:]*,;
|
|
# Match the return type when it is "ordinary".
|
|
$SIMPLE_RETURN_PART = qr,((struct|class|enum|union)\s+)?${CP_SYMBOL}+,;
|
|
|
|
# Match a return type.
|
|
$RETURN_PART = qr,((const|volatile)\s+)?(${SIMPLE_RETURN_PART})${POINTER_PART},;
|
|
|
|
# Match "virtual".
|
|
$VIRTUAL_PART = qr,virtual\s,;
|
|
|
|
# Match the TARGET_DEFAULT_* attribute for a method.
|
|
$TARGET_DEFAULT_PART = qr,TARGET_DEFAULT_(?<style>[A-Z_]+)\s*\((?<default_arg>.*)\),;
|
|
|
|
# Match the arguments and trailing attribute of a method definition.
|
|
# Note we don't match the trailing ";".
|
|
$METHOD_TRAILER = qr,\s*${TARGET_DEFAULT_PART}$,;
|
|
|
|
# Match an entire method definition.
|
|
$METHOD = ($INTRO_PART . $VIRTUAL_PART . "(?<return_type>" . $RETURN_PART . ")"
|
|
. $NAME_PART . $ARGS_PART
|
|
. $METHOD_TRAILER);
|
|
|
|
# Match TARGET_DEBUG_PRINTER in an argument type.
|
|
# This must match the whole "sub-expression" including the parens.
|
|
# Reference $1 must refer to the function argument.
|
|
$TARGET_DEBUG_PRINTER = qr,\s*TARGET_DEBUG_PRINTER\s*\(([^)]*)\)\s*,;
|
|
|
|
sub trim($) {
|
|
my ($result) = @_;
|
|
|
|
$result =~ s,^\s+,,;
|
|
$result =~ s,\s+$,,;
|
|
|
|
return $result;
|
|
}
|
|
|
|
# Read from the input files until we find the trigger line.
|
|
# Die if not found.
|
|
sub find_trigger() {
|
|
while (<>) {
|
|
chomp;
|
|
return if m/$TRIGGER/;
|
|
}
|
|
|
|
die "could not find trigger line\n";
|
|
}
|
|
|
|
# Scan target.h and return a list of possible target_ops method entries.
|
|
sub scan_target_h() {
|
|
my $all_the_text = '';
|
|
|
|
find_trigger();
|
|
while (<>) {
|
|
chomp;
|
|
# Skip the open brace.
|
|
next if /{/;
|
|
last if m/$ENDER/;
|
|
|
|
# Strip // comments.
|
|
$_ =~ s,//.*$,,;
|
|
|
|
$all_the_text .= $_;
|
|
}
|
|
|
|
# Now strip out the C comments.
|
|
$all_the_text =~ s,/\*(.*?)\*/,,g;
|
|
|
|
# Replace sequences of tabs and/or whitespace with a single
|
|
# whitespace character. We need the whitespace because the method
|
|
# may have been split between multiple lines, like e.g.:
|
|
#
|
|
# virtual std::vector<long_type_name>
|
|
# my_long_method_name ()
|
|
# TARGET_DEFAULT_IGNORE ();
|
|
#
|
|
# If we didn't preserve the whitespace, then we'd end up with:
|
|
#
|
|
# virtual std::vector<long_type_name>my_long_method_name ()TARGET_DEFAULT_IGNORE ()
|
|
#
|
|
# ... which wouldn't later be parsed correctly.
|
|
$all_the_text =~ s/[\t\s]+/ /g;
|
|
|
|
return split (/;/, $all_the_text);
|
|
}
|
|
|
|
# Parse arguments into a list.
|
|
sub parse_argtypes($) {
|
|
my ($typestr) = @_;
|
|
|
|
$typestr =~ s/^\((.*)\)$/\1/;
|
|
|
|
my (@typelist) = split (/,\s*/, $typestr);
|
|
my (@result, $iter, $onetype);
|
|
|
|
foreach $iter (@typelist) {
|
|
if ($iter =~ m/^(enum\s+${SYMBOL}\s*)(${SYMBOL})?$/) {
|
|
$onetype = $1;
|
|
} elsif ($iter =~ m/^(.*(enum\s+)?${SYMBOL}.*(\s|\*|&))${SYMBOL}+$/) {
|
|
$onetype = $1;
|
|
} elsif ($iter eq 'void') {
|
|
next;
|
|
} else {
|
|
$onetype = $iter;
|
|
}
|
|
push @result, trim ($onetype);
|
|
}
|
|
|
|
return @result;
|
|
}
|
|
|
|
sub dname($) {
|
|
my ($name) = @_;
|
|
return "target_ops::" . $name;
|
|
}
|
|
|
|
# Write function header given name, return type, and argtypes.
|
|
# Returns a list of actual argument names.
|
|
sub write_function_header($$$@) {
|
|
my ($decl, $name, $return_type, @argtypes) = @_;
|
|
|
|
print $return_type;
|
|
|
|
if ($decl) {
|
|
if ($return_type !~ m,\*$,) {
|
|
print " ";
|
|
}
|
|
} else {
|
|
print "\n";
|
|
}
|
|
|
|
print $name . ' (';
|
|
|
|
my $iter;
|
|
my @argdecls;
|
|
my @actuals;
|
|
my $i = 0;
|
|
foreach $iter (@argtypes) {
|
|
my $val = $iter;
|
|
|
|
$val =~ s/$TARGET_DEBUG_PRINTER//;
|
|
|
|
if ($iter !~ m,(\*|&)$,) {
|
|
$val .= ' ';
|
|
}
|
|
|
|
my $vname;
|
|
$vname .= "arg$i";
|
|
$val .= $vname;
|
|
|
|
push @argdecls, $val;
|
|
push @actuals, $vname;
|
|
++$i;
|
|
}
|
|
|
|
print join (', ', @argdecls) . ")";
|
|
|
|
if ($decl) {
|
|
print " override;\n";
|
|
} else {
|
|
print "\n{\n";
|
|
}
|
|
|
|
return @actuals;
|
|
}
|
|
|
|
# Write out a declaration.
|
|
sub write_declaration($$@) {
|
|
my ($name, $return_type, @argtypes) = @_;
|
|
|
|
write_function_header (1, $name, $return_type, @argtypes);
|
|
}
|
|
|
|
# Write out a delegation function.
|
|
sub write_delegator($$@) {
|
|
my ($name, $return_type, @argtypes) = @_;
|
|
|
|
my (@names) = write_function_header (0, dname ($name),
|
|
$return_type, @argtypes);
|
|
|
|
print " ";
|
|
if ($return_type ne 'void') {
|
|
print "return ";
|
|
}
|
|
print "this->beneath ()->" . $name . " (";
|
|
print join (', ', @names);
|
|
print ");\n";
|
|
print "}\n\n";
|
|
}
|
|
|
|
sub tdname ($) {
|
|
my ($name) = @_;
|
|
return "dummy_target::" . $name;
|
|
}
|
|
|
|
# Write out a default function.
|
|
sub write_tdefault($$$$@) {
|
|
my ($content, $style, $name, $return_type, @argtypes) = @_;
|
|
|
|
my (@names) = write_function_header (0, tdname ($name),
|
|
$return_type, @argtypes);
|
|
|
|
if ($style eq 'FUNC') {
|
|
print " ";
|
|
if ($return_type ne 'void') {
|
|
print "return ";
|
|
}
|
|
print $content . " (this";
|
|
if (@names) {
|
|
print ", ";
|
|
}
|
|
print join (', ', @names);
|
|
print ");\n";
|
|
} elsif ($style eq 'RETURN') {
|
|
print " return $content;\n";
|
|
} elsif ($style eq 'NORETURN') {
|
|
print " $content;\n";
|
|
} elsif ($style eq 'IGNORE') {
|
|
# Nothing.
|
|
} else {
|
|
die "unrecognized style: $style\n";
|
|
}
|
|
|
|
print "}\n\n";
|
|
|
|
return tdname ($name);
|
|
}
|
|
|
|
sub munge_type($) {
|
|
my ($typename) = @_;
|
|
my ($result);
|
|
|
|
if ($typename =~ m/$TARGET_DEBUG_PRINTER/) {
|
|
$result = $1;
|
|
} else {
|
|
($result = $typename) =~ s/\s+$//;
|
|
$result =~ s/[ ()<>:]/_/g;
|
|
$result =~ s/[*]/p/g;
|
|
$result =~ s/&/r/g;
|
|
|
|
# Identifers with double underscores are reserved to the C++
|
|
# implementation.
|
|
$result =~ s/_+/_/g;
|
|
|
|
# Avoid ending the function name with underscore, for
|
|
# cosmetics. Trailing underscores appear after munging types
|
|
# with template parameters, like e.g. "foo<int>".
|
|
$result =~ s/_$//g;
|
|
|
|
$result = 'target_debug_print_' . $result;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
# Write out a debug method.
|
|
sub write_debugmethod($$$@) {
|
|
my ($content, $name, $return_type, @argtypes) = @_;
|
|
|
|
my ($debugname) = "debug_target::" . $name;
|
|
my ($targetname) = $name;
|
|
|
|
my (@names) = write_function_header (0, $debugname, $return_type, @argtypes);
|
|
|
|
if ($return_type ne 'void') {
|
|
print " $return_type result;\n";
|
|
}
|
|
|
|
print " fprintf_unfiltered (gdb_stdlog, \"-> %s->$name (...)\\n\", this->beneath ()->shortname ());\n";
|
|
|
|
# Delegate to the beneath target.
|
|
print " ";
|
|
if ($return_type ne 'void') {
|
|
print "result = ";
|
|
}
|
|
print "this->beneath ()->" . $name . " (";
|
|
print join (', ', @names);
|
|
print ");\n";
|
|
|
|
# Now print the arguments.
|
|
print " fprintf_unfiltered (gdb_stdlog, \"<- %s->$name (\", this->beneath ()->shortname ());\n";
|
|
for my $i (0 .. $#argtypes) {
|
|
if ($i > 0) {
|
|
print " fputs_unfiltered (\", \", gdb_stdlog);\n"
|
|
}
|
|
my $printer = munge_type ($argtypes[$i]);
|
|
print " $printer ($names[$i]);\n";
|
|
}
|
|
if ($return_type ne 'void') {
|
|
print " fputs_unfiltered (\") = \", gdb_stdlog);\n";
|
|
my $printer = munge_type ($return_type);
|
|
print " $printer (result);\n";
|
|
print " fputs_unfiltered (\"\\n\", gdb_stdlog);\n";
|
|
} else {
|
|
print " fputs_unfiltered (\")\\n\", gdb_stdlog);\n";
|
|
}
|
|
|
|
if ($return_type ne 'void') {
|
|
print " return result;\n";
|
|
}
|
|
|
|
print "}\n\n";
|
|
|
|
return $debugname;
|
|
}
|
|
|
|
print "/* THIS FILE IS GENERATED -*- buffer-read-only: t -*- */\n";
|
|
print "/* vi:set ro: */\n\n";
|
|
print "/* To regenerate this file, run:*/\n";
|
|
print "/* make-target-delegates target.h > target-delegates.c */\n";
|
|
print "\n";
|
|
|
|
@lines = scan_target_h();
|
|
|
|
@delegators = ();
|
|
@return_types = ();
|
|
@tdefaults = ();
|
|
@styles = ();
|
|
@argtypes_array = ();
|
|
|
|
foreach $current_line (@lines) {
|
|
# See comments in scan_target_h. Here we strip away the leading
|
|
# and trailing whitespace.
|
|
$current_line = trim ($current_line);
|
|
|
|
next unless $current_line =~ m/$METHOD/;
|
|
|
|
my $name = $+{name};
|
|
my $current_line = $+{args};
|
|
my $return_type = trim ($+{return_type});
|
|
my $current_args = $+{args};
|
|
my $tdefault = $+{default_arg};
|
|
my $style = $+{style};
|
|
|
|
my @argtypes = parse_argtypes ($current_args);
|
|
|
|
push @delegators, $name;
|
|
|
|
$return_types{$name} = $return_type;
|
|
$tdefaults{$name} = $tdefault;
|
|
$styles{$name} = $style;
|
|
$argtypes_array{$name} = \@argtypes;
|
|
}
|
|
|
|
sub print_class($) {
|
|
my ($name) = @_;
|
|
|
|
print "struct " . $name . " : public target_ops\n";
|
|
print "{\n";
|
|
print " const target_info &info () const override;\n";
|
|
print "\n";
|
|
print " strata stratum () const override;\n";
|
|
print "\n";
|
|
|
|
for $name (@delegators) {
|
|
my $return_type = $return_types{$name};
|
|
my @argtypes = @{$argtypes_array{$name}};
|
|
|
|
print " ";
|
|
write_declaration ($name, $return_type, @argtypes);
|
|
}
|
|
|
|
print "};\n\n";
|
|
}
|
|
|
|
print_class ("dummy_target");
|
|
print_class ("debug_target");
|
|
|
|
for $name (@delegators) {
|
|
my $tdefault = $tdefaults{$name};
|
|
my $return_type = $return_types{$name};
|
|
my $style = $styles{$name};
|
|
my @argtypes = @{$argtypes_array{$name}};
|
|
|
|
write_delegator ($name, $return_type, @argtypes);
|
|
|
|
write_tdefault ($tdefault, $style, $name, $return_type, @argtypes);
|
|
|
|
write_debugmethod ($tdefault, $name, $return_type, @argtypes);
|
|
}
|