| #!/bin/bash |
| |
| results_dir=/tmp/ctfdwdiff |
| |
| diff_tool() { |
| local tool=$1 |
| local dwarf_options=$2 |
| local ctf_options=$3 |
| local obj=$4 |
| |
| diff=$results_dir/$obj.$tool.diff |
| ctf=$results_dir/$obj.$tool.ctf.c |
| dwarf=$results_dir/$obj.$tool.dwarf.c |
| $tool -F ctf $ctf_options $obj > $ctf |
| $tool -F dwarf $dwarf_options $obj > $dwarf |
| diff -up $dwarf $ctf > $diff |
| if [ -s $diff ] ; then |
| [ $# -gt 4 ] && vim $diff |
| exit 0 |
| else |
| rm -f $diff $ctf $dwarf |
| fi |
| } |
| |
| diff_one() { |
| local obj=$1 |
| diff_tool "pahole" "--flat_arrays --show_private_classes --fixup_silly_bitfields" " " $obj $2 |
| diff_tool "pfunct" "-V --no_parm_names" "-V" $obj $2 |
| } |
| |
| |
| diff_dir() { |
| find . -type d | \ |
| while read dir ; do |
| cd $dir |
| ls *.o 2> /dev/null | |
| while read obj ; do |
| ncus=$(readelf -wi $obj | grep DW_TAG_compile_unit | wc -l) |
| if [ $ncus -ne 1 ] ; then |
| continue |
| fi |
| echo $obj |
| pahole -Z $obj |
| diff_one $obj $1 |
| done |
| cd - > /dev/null |
| done |
| } |
| |
| rm -rf $results_dir |
| mkdir $results_dir |
| |
| if [ $# -lt 2 ] ; then |
| diff_dir |
| else |
| diff_one $* |
| fi |