X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2FGenLibDeps.pl;h=e501774251887a15b5f39c452c6418dfe11e5c48;hb=f45a82890e34984ad1e1e259f8fb902caddfb0b1;hp=ee8cc7aa2abd15a83988aa549817a1c6cd831edc;hpb=dd73e7fa0950fa0244ab97984347cb442d553ff0;p=oota-llvm.git diff --git a/utils/GenLibDeps.pl b/utils/GenLibDeps.pl index ee8cc7aa2ab..e5017742518 100755 --- a/utils/GenLibDeps.pl +++ b/utils/GenLibDeps.pl @@ -6,21 +6,30 @@ # libraries. The output of this script should periodically replace # the similar content in the UsingLibraries.html document. # -# Syntax: GenLibDeps.pl [-flat] +# Syntax: GenLibDeps.pl [-flat] [path_to_nm_binary] # +use strict; # Parse arguments... +my $FLAT = 0; +my $WHY = 0; while (scalar(@ARGV) and ($_ = $ARGV[0], /^[-+]/)) { shift; last if /^--$/; # Stop processing arguments on -- # List command line options here... if (/^-flat$/) { $FLAT = 1; next; } + if (/^-why/) { $WHY = 1; $FLAT = 1; next; } print "Unknown option: $_ : ignoring!\n"; } # Give first option a name. my $Directory = $ARGV[0]; +if (!defined($Directory) || ! -d "$Directory") { + die "First argument must specify the directory containing LLVM libs\n"; +} + +my $nmPath = $ARGV[1]; # Find the "dot" program my $DotPath=""; @@ -29,16 +38,18 @@ if (!$FLAT) { die "Can't find 'dot'" if (! -x "$DotPath"); } -chomp(my $nmPath=`which nm`); -die "Can't find 'nm'" if (! -x "$nmPath"); +if (!defined($nmPath) || $nmPath eq "") { + chomp($nmPath=`which nm`); + die "Can't find 'nm'" if (! -x "$nmPath"); +} # Open the directory and read its contents, sorting by name and differentiating # by whether its a library (.a) or an object file (.o) opendir DIR,$Directory; my @files = readdir DIR; closedir DIR; -@libs = grep(/libLLVM.*\.a$/,sort(@files)); -@objs = grep(/LLVM.*\.o$/,sort(@files)); +my @libs = grep(/libLLVM.*\.(dylib|so|a)$/,sort(@files)); +my @objs = grep(/LLVM.*\.o$/,sort(@files)); # Declare the hashes we will use to keep track of the library and object file # symbol definitions. @@ -46,22 +57,26 @@ my %libdefs; my %objdefs; # Gather definitions from the libraries -foreach $lib (@libs ) { - open DEFS, - "$nmPath -g $Directory/$lib | grep ' [ABCDGRST] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRST] //' | sort | uniq |"; +foreach my $lib (@libs ) { + open DEFS, "$nmPath -g $Directory/$lib|"; while () { - chomp($_); + next if (! / [ABCDGRST] /); + s/^[^ ]* [ABCDGRST] //; + s/\015?\012//; # not sure if is in binmode and uses LF or CRLF. + # this strips both LF and CRLF. $libdefs{$_} = $lib; } close DEFS; } # Gather definitions from the object files. -foreach $obj (@objs ) { - open DEFS, - "$nmPath -g $Directory/$obj | grep ' [ABCDGRST] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRST] //' | sort | uniq |"; +foreach my $obj (@objs ) { + open DEFS, "$nmPath -g $Directory/$obj |"; while () { - chomp($_); + next if (! / [ABCDGRST] /); + s/^[^ ]* [ABCDGRST] //; + s/\015?\012//; # not sure if is in binmode and uses LF or CRLF. + # this strips both LF and CRLF. $objdefs{$_} = $obj; } close DEFS; @@ -76,46 +91,80 @@ sub gen_one_entry { $lib_ns =~ s/(.*)\.[oa]/$1/; if ($FLAT) { print "$lib:"; + if ($WHY) { print "\n"; } } else { print "
$lib
    \n"; } open UNDEFS, - "$nmPath -g -u $Directory/$lib | sed -e 's/^ *U //' | sort | uniq |"; - open DEPENDS, - "| sort | uniq > GenLibDeps.out"; + "$nmPath -g -u $Directory/$lib | sed -e 's/^[ 0]* U //' | sort | uniq |"; + my %DepLibs; while () { chomp; + my $lib_printed = 0; if (defined($libdefs{$_}) && $libdefs{$_} ne $lib) { - print DEPENDS "$libdefs{$_}\n"; + $DepLibs{$libdefs{$_}} = [] unless exists $DepLibs{$libdefs{$_}}; + push(@{$DepLibs{$libdefs{$_}}}, $_); } elsif (defined($objdefs{$_}) && $objdefs{$_} ne $lib) { - $libroot = $lib; + my $libroot = $lib; $libroot =~ s/lib(.*).a/$1/; if ($objdefs{$_} ne "$libroot.o") { - print DEPENDS "$objdefs{$_}\n"; + $DepLibs{$objdefs{$_}} = [] unless exists $DepLibs{$objdefs{$_}}; + push(@{$DepLibs{$objdefs{$_}}}, $_); } } } close UNDEFS; - close DEPENDS; - open DF, ") { - chomp; + unless(keys %DepLibs) { + # above failed + open UNDEFS, "$nmPath -g -u $Directory/$lib |"; + while () { + # to bypass non-working sed + if (' ' eq substr($_,0,2) and index($_,'U ')) { + $_ = substr($_,index($_,'U ')+2) + }; + $_ = substr($_,index($_,' *U ')+5) if -1!=index($_,' *U '); + + chomp; + my $lib_printed = 0; + if (defined($libdefs{$_}) && $libdefs{$_} ne $lib) { + $DepLibs{$libdefs{$_}} = [] unless exists $DepLibs{$libdefs{$_}}; + push(@{$DepLibs{$libdefs{$_}}}, $_); + } elsif (defined($objdefs{$_}) && $objdefs{$_} ne $lib) { + my $libroot = $lib; + $libroot =~ s/lib(.*).a/$1/; + if ($objdefs{$_} ne "$libroot.o") { + $DepLibs{$objdefs{$_}} = [] unless exists $DepLibs{$objdefs{$_}}; + push(@{$DepLibs{$objdefs{$_}}}, $_); + } + } + } + } + + for my $key (sort keys %DepLibs) { if ($FLAT) { - print " $_"; + print " $key"; + if ($WHY) { + print "\n"; + my @syms = @{$DepLibs{$key}}; + foreach my $sym (@syms) { + print " $sym\n"; + } + } } else { - print "
  • $_
  • \n"; + print "
  • $key
  • \n"; } - $suffix = substr($_,length($_)-1,1); - $_ =~ s/(.*)\.[oa]/$1/; + my $suffix = substr($key,length($key)-1,1); + $key =~ s/(.*)\.[oa]/$1/; if ($suffix eq "a") { - if (!$FLAT) { print DOT "$lib_ns -> $_ [ weight=0 ];\n" }; + if (!$FLAT) { print DOT "$lib_ns -> $key [ weight=0 ];\n" }; } else { - if (!$FLAT) { print DOT "$lib_ns -> $_ [ weight=10];\n" }; + if (!$FLAT) { print DOT "$lib_ns -> $key [ weight=10];\n" }; } } - close DF; if ($FLAT) { - print "\n"; + if (!$WHY) { + print "\n"; + } } else { print "
\n"; } @@ -131,13 +180,27 @@ if (!$FLAT) { open DOT, "| $DotPath -Tgif > libdeps.gif"; - print DOT "digraph LibDeps {size=\"40,15\"; ratio=\"1.33333\"; margin=\"0.25\"; rankdir=\"LR\"; mclimit=\"50.0\"; ordering=\"out\"; center=\"1\";\n"; - print DOT "node [shape=\"box\",color=\"#000088\",fillcolor=\"#FFFACD\",fontcolor=\"#5577DD\",style=\"filled\",fontsize=\"24\"];\n"; - print DOT "edge [style=\"solid\",color=\"#000088\"];\n"; + print DOT "digraph LibDeps {\n"; + print DOT " size=\"40,15\"; \n"; + print DOT " ratio=\"1.33333\"; \n"; + print DOT " margin=\"0.25\"; \n"; + print DOT " rankdir=\"LR\"; \n"; + print DOT " mclimit=\"50.0\"; \n"; + print DOT " ordering=\"out\"; \n"; + print DOT " center=\"1\";\n"; + print DOT "node [shape=\"box\",\n"; + print DOT " color=\"#000088\",\n"; + print DOT " fillcolor=\"#FFFACD\",\n"; + print DOT " fontcolor=\"#3355BB\",\n"; + print DOT " style=\"filled\",\n"; + print DOT " fontname=\"sans\",\n"; + print DOT " fontsize=\"24\"\n"; + print DOT "];\n"; + print DOT "edge [dir=\"forward\",style=\"solid\",color=\"#000088\"];\n"; } # Print libraries first -foreach $lib (@libs) { +foreach my $lib (@libs) { gen_one_entry($lib); } @@ -145,13 +208,26 @@ if (!$FLAT) { print DOT "}\n"; close DOT; open DOT, "| $DotPath -Tgif > objdeps.gif"; - print DOT "digraph ObjDeps {size=\"40,15\"; ratio=\"1.33333\"; margin=\"0.25\"; rankdir=\"LR\"; mclimit=\"50.0\"; ordering=\"out\"; center=\"1\";\n"; - print DOT "node [shape=\"box\",color=\"#000088\",fillcolor=\"#FFFACD\",fontcolor=\"#5577DD\",style=\"filled\",fontsize=\"24\"];\n"; - print DOT "edge [style=\"solid\",color=\"#000088\"];\n"; + print DOT "digraph ObjDeps {\n"; + print DOT " size=\"8,10\";\n"; + print DOT " margin=\"0.25\";\n"; + print DOT " rankdir=\"LR\";\n"; + print DOT " mclimit=\"50.0\";\n"; + print DOT " ordering=\"out\";\n"; + print DOT " center=\"1\";\n"; + print DOT "node [shape=\"box\",\n"; + print DOT " color=\"#000088\",\n"; + print DOT " fillcolor=\"#FFFACD\",\n"; + print DOT " fontcolor=\"#3355BB\",\n"; + print DOT " fontname=\"sans\",\n"; + print DOT " style=\"filled\",\n"; + print DOT " fontsize=\"24\"\n"; + print DOT "];\n"; + print DOT "edge [dir=\"forward\",style=\"solid\",color=\"#000088\"];\n"; } # Print objects second -foreach $obj (@objs) { +foreach my $obj (@objs) { gen_one_entry($obj); }