gdb/make-target-delegates - gdb
Data types defined
Source code
- #!/usr/bin/perl
- $TRIGGER = qr,^struct target_ops$,;
- $ENDER = qr,^\s*};$,;
- $SYMBOL = qr,[a-zA-Z_][a-zA-Z0-9_]*,;
- $NAME_PART = qr,\(\*(?<name>${SYMBOL}+)\)\s,;
- $ARGS_PART = qr,(?<args>\(.*\)),;
- $INTRO_PART = qr,^,;
- $SIMPLE_RETURN_PART = qr,[^\(]+,;
- $VEC_RETURN_PART = qr,VEC\s*\([^\)]+\)[^\(]*,;
- $TARGET_DEFAULT_PART = qr,TARGET_DEFAULT_(?<style>[A-Z_]+)\s*\((?<default_arg>.*)\),;
- $METHOD_TRAILER = qr,\s*${TARGET_DEFAULT_PART}$,;
- $METHOD = ($INTRO_PART . "(?<return_type>" . $SIMPLE_RETURN_PART
- . "|" . $VEC_RETURN_PART . ")"
- . $NAME_PART . $ARGS_PART
- . $METHOD_TRAILER);
- $TARGET_DEBUG_PRINTER = qr,\s*TARGET_DEBUG_PRINTER\s*\(([^)]*)\)\s*,;
- sub trim($) {
- my ($result) = @_;
- $result =~ s,^\s+,,;
- $result =~ s,\s+$,,;
- return $result;
- }
- sub find_trigger() {
- while (<>) {
- chomp;
- return if m/$TRIGGER/;
- }
- die "could not find trigger line\n";
- }
- sub scan_target_h() {
- my $all_the_text = '';
- find_trigger();
- while (<>) {
- chomp;
-
- next if /{/;
- last if m/$ENDER/;
-
- $_ =~ s,//.*$,,;
- $_ = trim ($_);
- $all_the_text .= $_;
- }
-
- $all_the_text =~ s,/\*(.*?)\*/,,g;
- return split (/;/, $all_the_text);
- }
- 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) = @_;
- $name =~ s/to_/delegate_/;
- return $name;
- }
- sub write_function_header($$@) {
- my ($name, $return_type, @argtypes) = @_;
- print "static " . $return_type . "\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;
- if ($i == 0) {
-
- $vname = 'self';
- } else {
- $vname .= "arg$i";
- }
- $val .= $vname;
- push @argdecls, $val;
- push @actuals, $vname;
- ++$i;
- }
- print join (', ', @argdecls) . ")\n";
- print "{\n";
- return @actuals;
- }
- sub write_delegator($$@) {
- my ($name, $return_type, @argtypes) = @_;
- my (@names) = write_function_header (dname ($name), $return_type,
- @argtypes);
- print " $names[0] = $names[0]->beneath;\n";
- print " ";
- if ($return_type ne 'void') {
- print "return ";
- }
- print "$names[0]->" . $name . " (";
- print join (', ', @names);
- print ");\n";
- print "}\n\n";
- }
- sub tdname ($) {
- my ($name) = @_;
- $name =~ s/to_/tdefault_/;
- return $name;
- }
- sub write_tdefault($$$$@) {
- my ($content, $style, $name, $return_type, @argtypes) = @_;
- if ($style eq 'FUNC') {
- return $content;
- }
- write_function_header (tdname ($name), $return_type, @argtypes);
- if ($style eq 'RETURN') {
- print " return $content;\n";
- } elsif ($style eq 'NORETURN') {
- print " $content;\n";
- } elsif ($style eq 'IGNORE') {
-
- } 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 = 'target_debug_print_' . $result;
- }
- return $result;
- }
- sub write_debugmethod($$$$@) {
- my ($content, $style, $name, $return_type, @argtypes) = @_;
- my ($debugname) = $name;
- $debugname =~ s/to_/debug_/;
- my ($targetname) = $name;
- $targetname =~ s/to_/target_/;
- my (@names) = write_function_header ($debugname, $return_type, @argtypes);
- if ($return_type ne 'void') {
- print " $return_type result;\n";
- }
- print " fprintf_unfiltered (gdb_stdlog, \"-> %s->$name (...)\\n\", debug_target.to_shortname);\n";
-
- print " ";
- if ($return_type ne 'void') {
- print "result = ";
- }
- print "debug_target." . $name . " (";
- my @names2 = @names;
- @names2[0] = "&debug_target";
- print join (', ', @names2);
- print ");\n";
-
- print " fprintf_unfiltered (gdb_stdlog, \"<- %s->$name (\", debug_target.to_shortname);\n";
- for my $i (0 .. $#argtypes) {
- print " fputs_unfiltered (\", \", gdb_stdlog);\n" if $i > 0;
- my $printer = munge_type ($argtypes[$i]);
- print " $printer ($names2[$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";
- @lines = scan_target_h();
- %tdefault_names = ();
- %debug_names = ();
- @delegators = ();
- foreach $current_line (@lines) {
- next unless $current_line =~ m/$METHOD/;
- $name = $+{name};
- $current_line = $+{args};
- $return_type = trim ($+{return_type});
- $current_args = $+{args};
- $tdefault = $+{default_arg};
- $style = $+{style};
- @argtypes = parse_argtypes ($current_args);
-
- 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);
- $debug_names{$name} = write_debugmethod ($tdefault, $style,
- $name, $return_type,
- @argtypes);
- }
- }
- print "static void\ninstall_delegators (struct target_ops *ops)\n{\n";
- for $iter (@delegators) {
- print " if (ops->" . $iter . " == NULL)\n";
- print " ops->" . $iter . " = " . dname ($iter) . ";\n";
- }
- print "}\n\n";
- print "static void\ninstall_dummy_methods (struct target_ops *ops)\n{\n";
- for $iter (@delegators) {
- print " ops->" . $iter . " = " . $tdefault_names{$iter} . ";\n";
- }
- print "}\n\n";
- print "static void\ninit_debug_target (struct target_ops *ops)\n{\n";
- for $iter (@delegators) {
- print " ops->" . $iter . " = " . $debug_names{$iter} . ";\n";
- }
- print "}\n";