diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2006-07-25 19:12:06 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2006-07-25 19:12:06 +0000 |
commit | c152efda47d8c90f540422bb374620b7fb1effbf (patch) | |
tree | 4bf08dc7d17c19bb95e04b2f4cd1fb865360d031 /utils/GenLibDeps.pl | |
parent | 865f6238f61c25865cfba53934bfd69c2bd36194 (diff) | |
download | external_llvm-c152efda47d8c90f540422bb374620b7fb1effbf.zip external_llvm-c152efda47d8c90f540422bb374620b7fb1effbf.tar.gz external_llvm-c152efda47d8c90f540422bb374620b7fb1effbf.tar.bz2 |
Add a feature for debugging library dependency cycles, -why option. This
implies -flat and will produce a list of all the symbols for each library
that another library depends on. Run the output through c++filt for
better readability. Also, don't generate a temporary file for storing the
dependent library names. Perl can handle it in a %hash.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29273 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/GenLibDeps.pl')
-rwxr-xr-x | utils/GenLibDeps.pl | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/utils/GenLibDeps.pl b/utils/GenLibDeps.pl index ee8cc7aa..b14e5e0 100755 --- a/utils/GenLibDeps.pl +++ b/utils/GenLibDeps.pl @@ -10,12 +10,15 @@ # # 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"; } @@ -76,46 +79,54 @@ sub gen_one_entry { $lib_ns =~ s/(.*)\.[oa]/$1/; if ($FLAT) { print "$lib:"; + if ($WHY) { print "\n"; } } else { print " <dt><b>$lib</b</dt><dd><ul>\n"; } open UNDEFS, "$nmPath -g -u $Directory/$lib | sed -e 's/^ *U //' | sort | uniq |"; - open DEPENDS, - "| sort | uniq > GenLibDeps.out"; + my %DepLibs; while (<UNDEFS>) { 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; $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, "<GenLibDeps.out"; - while (<DF>) { - chomp; + for my $key (sort keys %DepLibs) { if ($FLAT) { - print " $_"; + print " $key"; + if ($WHY) { + print "\n"; + my @syms = @{$DepLibs{$key}}; + foreach $sym (@syms) { + print " $sym\n"; + } + } } else { - print " <li>$_</li>\n"; + print " <li>$key</li>\n"; } - $suffix = substr($_,length($_)-1,1); - $_ =~ s/(.*)\.[oa]/$1/; + $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 " </ul></dd>\n"; } |