X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2FGenLibDeps.pl;h=74eedd3383bcac469dd2252a04e9de6a9d073bc9;hb=8a6ccb5f73cf2e490faa181ad6662633b3ee38df;hp=be7af22df43656c956bbe6d958b78ce0ae596837;hpb=1bc686433bd5dea7ef4b8b5d97cd9461f041b56f;p=oota-llvm.git diff --git a/utils/GenLibDeps.pl b/utils/GenLibDeps.pl index be7af22df43..74eedd3383b 100755 --- a/utils/GenLibDeps.pl +++ b/utils/GenLibDeps.pl @@ -8,6 +8,7 @@ # # Syntax: GenLibDeps.pl [-flat] [path_to_nm_binary] # +use strict; # Parse arguments... my $FLAT = 0; @@ -24,6 +25,10 @@ while (scalar(@ARGV) and ($_ = $ARGV[0], /^[-+]/)) { # 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 @@ -33,9 +38,9 @@ if (!$FLAT) { die "Can't find 'dot'" if (! -x "$DotPath"); } -if ($nmPath eq "") { - chomp($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 @@ -43,8 +48,8 @@ if ($nmPath eq "") { 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. @@ -52,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; @@ -96,7 +105,7 @@ sub gen_one_entry { $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") { $DepLibs{$objdefs{$_}} = [] unless exists $DepLibs{$objdefs{$_}}; @@ -111,14 +120,14 @@ sub gen_one_entry { if ($WHY) { print "\n"; my @syms = @{$DepLibs{$key}}; - foreach $sym (@syms) { + foreach my $sym (@syms) { print " $sym\n"; } } } else { print "
  • $key
  • \n"; } - $suffix = substr($key,length($key)-1,1); + 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" }; @@ -145,13 +154,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); } @@ -159,13 +182,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); }