X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2FGenLibDeps.pl;h=16aed89474895983f348a5b4d80cf4f3eab53165;hb=790e11cdff59ed6312c2f1d3d8f63537c2ae2ec5;hp=3bdb92ababba09e51a7c06ccccaaff57c68f9423;hpb=579b8de1c2c747736c8b6e110742e3dbed66a443;p=oota-llvm.git diff --git a/utils/GenLibDeps.pl b/utils/GenLibDeps.pl index 3bdb92ababb..16aed894748 100755 --- a/utils/GenLibDeps.pl +++ b/utils/GenLibDeps.pl @@ -6,19 +6,50 @@ # libraries. The output of this script should periodically replace # the similar content in the UsingLibraries.html document. # -# Syntax: GenLibDeps.pl +# 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=""; +if (!$FLAT) { + chomp($DotPath = `which dot`); + die "Can't find 'dot'" if (! -x "$DotPath"); +} + +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.*\.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. @@ -26,10 +57,11 @@ my %libdefs; my %objdefs; # Gather definitions from the libraries -foreach $lib (@libs ) { - open DEFS, - "nm -g --defined-only $lib | grep ' [ABCDGRSTVW] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRSTVW] //' | sort | uniq |"; +foreach my $lib (@libs ) { + open DEFS, "$nmPath -g $Directory/$lib|"; while () { + next if (! / [ABCDGRST] /); + s/^[^ ]* [ABCDGRST] //; chomp($_); $libdefs{$_} = $lib; } @@ -37,10 +69,11 @@ foreach $lib (@libs ) { } # Gather definitions from the object files. -foreach $obj (@objs ) { - open DEFS, - "nm -g --defined-only $obj | grep ' [ABCDGRST] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRST] //' | sort | uniq |"; +foreach my $obj (@objs ) { + open DEFS, "$nmPath -g $Directory/$obj |"; while () { + next if (! / [ABCDGRST] /); + s/^[^ ]* [ABCDGRST] //; chomp($_); $objdefs{$_} = $obj; } @@ -52,32 +85,61 @@ foreach $obj (@objs ) { # object. The
provides a list of the libraries/objects it depends on. sub gen_one_entry { my $lib = $_[0]; - print "
$lib
\n"; + my $lib_ns = $lib; + $lib_ns =~ s/(.*)\.[oa]/$1/; + if ($FLAT) { + print "$lib:"; + if ($WHY) { print "\n"; } + } else { + print "
$lib
    \n"; + } open UNDEFS, - "nm -u $lib | grep ' U ' | sed -e 's/ U //' | sort | uniq |"; - open DEPENDS, - "| sort | uniq > GenLibDeps.out"; + "$nmPath -g -u $Directory/$lib | sed -e 's/^ *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; - print " $_\n"; + for my $key (sort keys %DepLibs) { + if ($FLAT) { + print " $key"; + if ($WHY) { + print "\n"; + my @syms = @{$DepLibs{$key}}; + foreach my $sym (@syms) { + print " $sym\n"; + } + } + } else { + print "
  • $key
  • \n"; + } + my $suffix = substr($key,length($key)-1,1); + $key =~ s/(.*)\.[oa]/$1/; + if ($suffix eq "a") { + if (!$FLAT) { print DOT "$lib_ns -> $key [ weight=0 ];\n" }; + } else { + if (!$FLAT) { print DOT "$lib_ns -> $key [ weight=10];\n" }; + } + } + if ($FLAT) { + if (!$WHY) { + print "\n"; + } + } else { + print "
\n"; } - close DF; - print " \n"; } # Make sure we flush on write. This is slower but correct based on the way we @@ -85,17 +147,66 @@ sub gen_one_entry { $| = 1; # Print the definition list tag -print "
\n"; +if (!$FLAT) { + print "
\n"; + + open DOT, "| $DotPath -Tgif > libdeps.gif"; + + 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); } +if (!$FLAT) { + print DOT "}\n"; + close DOT; + open DOT, "| $DotPath -Tgif > objdeps.gif"; + 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); } +if (!$FLAT) { + print DOT "}\n"; + close DOT; + # Print end tag of definition list element -print "
\n"; + print "
\n"; +}