diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2005-01-05 17:29:29 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2005-01-05 17:29:29 +0000 |
commit | 62345827641ef25b5c9075f9d776b22a8ac546b9 (patch) | |
tree | 5dc9d74ef4888dc2973234b2ac84ae250bf12d3f /utils/GenLibDeps.pl | |
parent | 33a12184ba2752465db835994088fe697245069b (diff) |
1. Make sure that "dot" can be found in the path
2. Fix a bug where the lib directory specified also had to be cwd
3. Weight the output so archive->archive edges are shorter
4. Generate two different graphs: one for libraries, one for objects.
5. Adjust the properties of the graphs till it looks nice.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19293 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/GenLibDeps.pl')
-rwxr-xr-x | utils/GenLibDeps.pl | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/utils/GenLibDeps.pl b/utils/GenLibDeps.pl index ee2c46c4c8..33abe5446f 100755 --- a/utils/GenLibDeps.pl +++ b/utils/GenLibDeps.pl @@ -12,6 +12,10 @@ # Give first option a name. my $Directory = $ARGV[0]; +# Find the "dot" program +chomp(my $DotPath = `which dot`); +die "Can't find 'dot'" if (! -x "$DotPath"); + # 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; @@ -28,7 +32,7 @@ my %objdefs; # Gather definitions from the libraries foreach $lib (@libs ) { open DEFS, - "nm -g --defined-only $lib | grep ' [ABCDGRST] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRST] //' | sort | uniq |"; + "nm -g --defined-only $Directory/$lib | grep ' [ABCDGRST] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRST] //' | sort | uniq |"; while (<DEFS>) { chomp($_); $libdefs{$_} = $lib; @@ -39,7 +43,7 @@ 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 |"; + "nm -g --defined-only $Directory/$obj | grep ' [ABCDGRST] ' | sed -e 's/^[0-9A-Fa-f]* [ABCDGRST] //' | sort | uniq |"; while (<DEFS>) { chomp($_); $objdefs{$_} = $obj; @@ -52,9 +56,11 @@ foreach $obj (@objs ) { # object. The <dd> provides a list of the libraries/objects it depends on. sub gen_one_entry { my $lib = $_[0]; + my $lib_ns = $lib; + $lib_ns =~ s/(.*)\.[oa]/$1/; print " <dt><b>$lib</b</dt><dd><ul>\n"; open UNDEFS, - "nm -u $lib | grep ' U ' | sed -e 's/ U //' | sort | uniq |"; + "nm -u $Directory/$lib | grep ' U ' | sed -e 's/ U //' | sort | uniq |"; open DEPENDS, "| sort | uniq > GenLibDeps.out"; while (<UNDEFS>) { @@ -75,6 +81,13 @@ sub gen_one_entry { while (<DF>) { chomp; print " <li>$_</li>\n"; + $suffix = substr($_,length($_)-1,1); + $_ =~ s/(.*)\.[oa]/$1/; + if ($suffix eq "a") { + print DOT "$lib_ns -> $_ [ weight=0 ];\n"; + } else { + print DOT "$lib_ns -> $_ [ weight=10];\n"; + } } close DF; print " </ul></dd>\n"; @@ -87,15 +100,29 @@ $| = 1; # Print the definition list tag print "<dl>\n"; +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 libraries first foreach $lib (@libs) { gen_one_entry($lib); } +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 objects second foreach $obj (@objs) { gen_one_entry($obj); } +print DOT "}\n"; +close DOT; + # Print end tag of definition list element print "</dl>\n"; |