+2014-07-23 Tom Tromey <tromey@redhat.com>
+
+ * make-target-delegates ($ARGS_PART): Match trailing close paren.
+ ($INTRO_PART): Don't match whitespace.
+ ($METHOD_TRAILER): Move earlier. Remove trailing semicolon and
+ argument matching.
+ ($METHOD): Add $METHOD_TRAILER.
+ (trim): Rewrite.
+ (scan_target_h): New sub.
+ Change main loop not to collect state.
+ * target-delegates.c: Rebuild.
+
2014-07-23 Gary Benson <gbenson@redhat.com>
* cp-support.c (gdb_demangle): Fix build on systems without
$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 start of arguments to a method.
-$ARGS_PART = qr,(?<args>\(.*)$,;
-# Match indentation.
-$INTRO_PART = qr,^\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,^,;
# Match the return type when it is "ordinary".
$SIMPLE_RETURN_PART = qr,[^\(]+,;
# Match the TARGET_DEFAULT_* attribute for a method.
$TARGET_DEFAULT_PART = qr,TARGET_DEFAULT_(?<style>[A-Z_]+)\s*\((?<default_arg>.*)\),;
-# Match the introductory line to a method definition.
+# 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 . "(?<return_type>" . $SIMPLE_RETURN_PART
. "|" . $VEC_RETURN_PART . ")"
- . $NAME_PART . $ARGS_PART);
-
-# Match the arguments and trailing attribute of a method definition.
-$METHOD_TRAILER = qr,(?<args>\(.+\))\s*${TARGET_DEFAULT_PART};$,;
+ . $NAME_PART . $ARGS_PART
+ . $METHOD_TRAILER);
sub trim($) {
my ($result) = @_;
- $result =~ s,^\s*(\S*)\s*$,\1,;
+
+ $result =~ s,^\s+,,;
+ $result =~ s,\s+$,,;
+
return $result;
}
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/;
+
+ # Just in case somebody ever uses C99.
+ $_ =~ s,//.*$,,;
+ $_ = trim ($_);
+
+ $all_the_text .= $_;
+ }
+
+ # Now strip out the C comments.
+ $all_the_text =~ s,/\*(.*?)\*/,,g;
+
+ return split (/;/, $all_the_text);
+}
+
# Parse arguments into a list.
sub parse_argtypes($) {
my ($typestr) = @_;
print "/* To regenerate this file, run:*/\n";
print "/* make-target-delegates target.h > target-delegates.c */\n";
-find_trigger();
+@lines = scan_target_h();
+
%tdefault_names = ();
@delegators = ();
-$current_line = '';
-while (<>) {
- chomp;
- last if m/$ENDER/;
-
- if ($current_line ne '') {
- s/^\s*//;
- $current_line .= $_;
- } elsif (m/$METHOD/) {
- $name = $+{name};
- $current_line = $+{args};
- $return_type = trim ($+{return_type});
- }
+foreach $current_line (@lines) {
+ next unless $current_line =~ m/$METHOD/;
- if ($current_line =~ /\);\s*$/) {
- if ($current_line =~ m,$METHOD_TRAILER,) {
- $current_args = $+{args};
- $tdefault = $+{default_arg};
- $style = $+{style};
+ $name = $+{name};
+ $current_line = $+{args};
+ $return_type = trim ($+{return_type});
+ $current_args = $+{args};
+ $tdefault = $+{default_arg};
+ $style = $+{style};
- @argtypes = parse_argtypes ($current_args);
+ @argtypes = parse_argtypes ($current_args);
- # The first argument must be "this" to be delegatable.
- if ($argtypes[0] =~ /\s*struct\s+target_ops\s*\*\s*/) {
- write_delegator ($name, $return_type, @argtypes);
+ # The first argument must be "this" to be delegatable.
+ if ($argtypes[0] =~ /\s*struct\s+target_ops\s*\*\s*/) {
+ write_delegator ($name, $return_type, @argtypes);
- push @delegators, $name;
-
- $tdefault_names{$name} = write_tdefault ($tdefault, $style,
- $name, $return_type,
- @argtypes);
- }
- }
+ push @delegators, $name;
- $current_line = '';
+ $tdefault_names{$name} = write_tdefault ($tdefault, $style,
+ $name, $return_type,
+ @argtypes);
}
}
return self->to_find_memory_regions (self, arg1, arg2);
}
-static char *
+static char *
delegate_make_corefile_notes (struct target_ops *self, bfd *arg1, int *arg2)
{
self = self->beneath;
return self->to_make_corefile_notes (self, arg1, arg2);
}
-static gdb_byte *
+static gdb_byte *
delegate_get_bookmark (struct target_ops *self, const char *arg1, int arg2)
{
self = self->beneath;
return self->to_get_bookmark (self, arg1, arg2);
}
-static gdb_byte *
+static gdb_byte *
tdefault_get_bookmark (struct target_ops *self, const char *arg1, int arg2)
{
tcomplain ();
generic_tls_error ();
}
-static enum target_xfer_status
-delegate_xfer_partial (struct target_ops *self, enum target_object arg1, const char *arg2, gdb_byte *arg3, const gdb_byte *arg4, ULONGEST arg5, ULONGEST arg6, ULONGEST *arg7)
+static enum target_xfer_status
+delegate_xfer_partial (struct target_ops *self, enum target_object arg1, const char *arg2, gdb_byte *arg3, const gdb_byte *arg4, ULONGEST arg5, ULONGEST arg6, ULONGEST *arg7)
{
self = self->beneath;
return self->to_xfer_partial (self, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
}
-static enum target_xfer_status
-tdefault_xfer_partial (struct target_ops *self, enum target_object arg1, const char *arg2, gdb_byte *arg3, const gdb_byte *arg4, ULONGEST arg5, ULONGEST arg6, ULONGEST *arg7)
+static enum target_xfer_status
+tdefault_xfer_partial (struct target_ops *self, enum target_object arg1, const char *arg2, gdb_byte *arg3, const gdb_byte *arg4, ULONGEST arg5, ULONGEST arg6, ULONGEST *arg7)
{
return TARGET_XFER_E_IO;
}
return 0;
}
-static enum exec_direction_kind
+static enum exec_direction_kind
delegate_execution_direction (struct target_ops *self)
{
self = self->beneath;
}
static int
-delegate_trace_find (struct target_ops *self, enum trace_find_type arg1, int arg2, CORE_ADDR arg3, CORE_ADDR arg4, int *arg5)
+delegate_trace_find (struct target_ops *self, enum trace_find_type arg1, int arg2, CORE_ADDR arg3, CORE_ADDR arg4, int *arg5)
{
self = self->beneath;
return self->to_trace_find (self, arg1, arg2, arg3, arg4, arg5);
}
static int
-tdefault_trace_find (struct target_ops *self, enum trace_find_type arg1, int arg2, CORE_ADDR arg3, CORE_ADDR arg4, int *arg5)
+tdefault_trace_find (struct target_ops *self, enum trace_find_type arg1, int arg2, CORE_ADDR arg3, CORE_ADDR arg4, int *arg5)
{
return -1;
}
tcomplain ();
}
-static enum btrace_error
-delegate_read_btrace (struct target_ops *self, VEC (btrace_block_s) **arg1, struct btrace_target_info *arg2, enum btrace_read_type arg3)
+static enum btrace_error
+delegate_read_btrace (struct target_ops *self, VEC (btrace_block_s) **arg1, struct btrace_target_info *arg2, enum btrace_read_type arg3)
{
self = self->beneath;
return self->to_read_btrace (self, arg1, arg2, arg3);
}
-static enum btrace_error
-tdefault_read_btrace (struct target_ops *self, VEC (btrace_block_s) **arg1, struct btrace_target_info *arg2, enum btrace_read_type arg3)
+static enum btrace_error
+tdefault_read_btrace (struct target_ops *self, VEC (btrace_block_s) **arg1, struct btrace_target_info *arg2, enum btrace_read_type arg3)
{
tcomplain ();
}