summaryrefslogtreecommitdiff
path: root/utils/GenLibDeps.pl
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2006-07-25 19:12:06 +0000
committerReid Spencer <rspencer@reidspencer.com>2006-07-25 19:12:06 +0000
commitc152efda47d8c90f540422bb374620b7fb1effbf (patch)
tree4bf08dc7d17c19bb95e04b2f4cd1fb865360d031 /utils/GenLibDeps.pl
parent865f6238f61c25865cfba53934bfd69c2bd36194 (diff)
downloadllvm-c152efda47d8c90f540422bb374620b7fb1effbf.tar.gz
llvm-c152efda47d8c90f540422bb374620b7fb1effbf.tar.bz2
llvm-c152efda47d8c90f540422bb374620b7fb1effbf.tar.xz
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-xutils/GenLibDeps.pl43
1 files changed, 27 insertions, 16 deletions
diff --git a/utils/GenLibDeps.pl b/utils/GenLibDeps.pl
index ee8cc7aa2a..b14e5e07d8 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";
}