#!/usr/bin/env perl

use Getopt::Std;
$DEBUG = 0;

sub parse_objdump_file {
  my ($filename) = @_;
  my @result;
  open (INPUT, $filename) or die "$filename: $!\n";
  print "opened objdump output file $filename\n" if $DEBUG;
  while (<INPUT>) {
    if (/\s*([0-9a-f]*):\t(([0-9a-f]{2} )+) *\t(.*)$/) {
      my ($addr, $bytes, $instr) = ($1, $2, $4);
      $addr = "0x" . $addr;
      $bytes =~ s/\s*(.*\S)\s*/$1/; # trim any remaining whitespace
      $instr =~ s/\s*(.*\S)\s*/$1/;
      push (@result, {'addr' => $addr, 'bytes' => $bytes, 'instr' => $instr});
      print "addr=$addr bytes='$bytes' instr='$instr'\n" if $DEBUG;
    }
  }
  close INPUT;
  return @result;
}

sub parse_gdb_file {
  my ($filename) = @_;
  my @result;
  my $got_addr;
  open (INPUT, $filename) or die "$filename: $!\n";
  print "opened gdb output file $filename\n" if $DEBUG;
  while (<INPUT>) {
    if (/^(0x[0-9a-f]*):\t([^\t]*)\t[^:]*:\t((0x[0-9a-f]{2}\s*)+)\s*$/) {
      my ($addr, $bytes, $instr) = ($1, $3, $2);
      $bytes =~ s/0x//g;
      $bytes =~ s/\s+/ /g;           # regularize whitespace
      $bytes =~ s/\s*(.*\S)\s*/$1/;  # trim any remaining whitespace
      $instr =~ s/\s*(.*\S)\s*/$1/;
      push (@result, {'addr' => $addr, 'bytes' => $bytes, 'instr' => $instr});
      print "addr=$addr bytes='$bytes' instr='$instr'\n" if $DEBUG;
    } elsif (/^(0x[0-9a-f]*):\t$/) { # deal with gdb's line breaker
      $got_addr = $1;
    } elsif ($got_addr && /^    ([^\t]*)\t[^:]*:\t((0x[0-9a-f]{2}\s*)+)\s*$/) {
      my ($addr, $bytes, $instr) = ($got_addr, $2, $1);
      $bytes =~ s/0x//g;
      $bytes =~ s/\s+/ /g;           # regularize whitespace
      $bytes =~ s/\s*(.*\S)\s*/$1/;  # trim any remaining whitespace
      $instr =~ s/\s*(.*\S)\s*/$1/;
      push (@result, {'addr' => $addr, 'bytes' => $bytes, 'instr' => $instr});
      print "addr=$addr bytes='$bytes' instr='$instr'\n" if $DEBUG;
      undef $got_addr;
    }
  }
  close INPUT;
  return @result;
}

sub binary_diffs {
  my ($objdump_file, $gdb_file) = @_;
  my @file1 = parse_objdump_file ($objdump_file);
  my @file2 = parse_gdb_file ($gdb_file);
  my $lastrecord = ($#file1 >= $#file2) ? ($#file1) : ($#file2);
  for (my $i = 0; $i <= $lastrecord; ++$i) {
    my $d1 = $file1[$i];
    my $d2 = $file2[$i];
    if ($d1->{'bytes'} ne $d2->{'bytes'}) {
      next if (($d1->{'instr'} eq $d2->{'instr'}) && $opt_d);
      printf "0x%08x:\t%30s \t%s\n", 0+$d1->{'addr'}, $d1->{'bytes'}, $d1->{'instr'};
      printf "0x%08x:\t%30s \t%s\n\n", 0+$d2->{'addr'}, $d2->{'bytes'}, $d2->{'instr'};
    }
  }
}

&getopts('d');
$objdump_file = $ARGV[0];
$gdb_file = $ARGV[1];
binary_diffs ($objdump_file, $gdb_file);
exit (0);
__END__
=pod

=head1 NAME

codegen-diff

=head1 SYNOPSIS

codegen-diff [-d] I<OBJDUMP-OUTPUT-FILE> I<GDB-DISASSEMBLY-FILE>

=head1 DESCRIPTION

B<codegen-diff> is a program that tries to show you the differences
between the code that B<llc> generated and the code that B<lli> generated.

The way you use it is as follows: first, you create I<OBJDUMP-OUTPUT-FILE>
by running B<objdump> on the B<llc> compiled and linked binary. You need to
trim down the result so it contains only the function of interest.

Second, you create I<GDB-DISASSEMBLY-FILE> by running B<gdb>, with my patch
to print out hex bytes in the B<disassemble> command output, on
B<lli>.  Set a breakpoint in C<Emitter::finishFunction()> and wait until
the function you want is compiled.  Then use the B<disassemble> command
to print out the assembly dump of the function B<lli> just compiled.
(Use C<lli -debug> to find out where the function starts and ends in memory.)
It's easiest to save this output by using B<script>.

Finally, you run B<codegen-diff>, as indicated in the Synopsis section of
this manpage. It will print out a two-line stanza for each mismatched
instruction, with the  B<llc> version first, and the  B<lli> version second.

=head1 OPTIONS

=over 4

=item -d

Don't show instructions where the bytes are different but they
disassemble to the same thing. This puts a lot of trust in the
disassembler, but it might help you highlight the more egregious cases
of misassembly.

=back

=head1 AUTHOR

B<codegen-diff> was written by Brian Gaeke.

=head1 SEE ALSO

L<gdb(1)>, L<objdump(1)>, L<script(1)>.

You will need my B<gdb> patch:

  http://llvm.cs.uiuc.edu/~gaeke/gdb-disassembly-print-bytes.patch

=cut
