forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
here little scriptie, nice scriptie...
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7104 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Brian Gaeke
committed
Jul 3, 2003
1 parent
9cedd43
commit 6bc3b7c
Showing
1 changed file
with
112 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
#!/usr/bin/perl | ||
|
||
sub parse_objdump_file { | ||
my ($filename) = @_; | ||
my @result; | ||
open (INPUT, $filename) or die "$filename: $!\n"; | ||
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}); | ||
} | ||
} | ||
close INPUT; | ||
return @result; | ||
} | ||
|
||
sub parse_gdb_file { | ||
my ($filename) = @_; | ||
my @result; | ||
my $got_addr; | ||
open (INPUT, $filename) or die "$filename: $!\n"; | ||
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}); | ||
} 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}); | ||
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'}) { | ||
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'}; | ||
} | ||
} | ||
} | ||
|
||
$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 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 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 |