diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-12-30 23:07:56 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-12-30 23:07:56 +0000 |
commit | 579b8de1c2c747736c8b6e110742e3dbed66a443 (patch) | |
tree | df62ae1aaf5d9f5a3127d8658632501282e3b4a6 /utils/GenLibDeps.pl | |
parent | 3d1cc28e7c1f96b25b1dce8b48d69b3f162460d2 (diff) | |
download | llvm-579b8de1c2c747736c8b6e110742e3dbed66a443.tar.gz llvm-579b8de1c2c747736c8b6e110742e3dbed66a443.tar.bz2 llvm-579b8de1c2c747736c8b6e110742e3dbed66a443.tar.xz |
A Perl script to generate an HTML definition list containing the LLVM
library dependencies, for documentation purposes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19194 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/GenLibDeps.pl')
-rwxr-xr-x | utils/GenLibDeps.pl | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/utils/GenLibDeps.pl b/utils/GenLibDeps.pl new file mode 100755 index 0000000000..3bdb92abab --- /dev/null +++ b/utils/GenLibDeps.pl @@ -0,0 +1,101 @@ +#!/usr/bin/perl -w +# +# Program: GenLibDeps.pl +# +# Synopsis: Generate HTML output that shows the dependencies between a set of +# libraries. The output of this script should periodically replace +# the similar content in the UsingLibraries.html document. +# +# Syntax: GenLibDeps.pl <directory_with_libraries_in_it> +# + +# Give first option a name. +my $Directory = $ARGV[0]; + +# 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)); + +# Declare the hashes we will use to keep track of the library and object file +# symbol definitions. +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 |"; + while (<DEFS>) { + chomp($_); + $libdefs{$_} = $lib; + } + close DEFS; +} + +# 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 |"; + while (<DEFS>) { + chomp($_); + $objdefs{$_} = $obj; + } + close DEFS; +} + +# Generate one entry in the <dl> list. This generates the <dt> and <dd> elements +# for one library or object file. The <dt> provides the name of the library or +# object. The <dd> provides a list of the libraries/objects it depends on. +sub gen_one_entry { + my $lib = $_[0]; + print " <dt><b>$lib</b</dt><dd>\n"; + open UNDEFS, + "nm -u $lib | grep ' U ' | sed -e 's/ U //' | sort | uniq |"; + open DEPENDS, + "| sort | uniq > GenLibDeps.out"; + while (<UNDEFS>) { + chomp; + if (defined($libdefs{$_}) && $libdefs{$_} ne $lib) { + print DEPENDS "$libdefs{$_}\n"; + } elsif (defined($objdefs{$_}) && $objdefs{$_} ne $lib) { + $libroot = $lib; + $libroot =~ s/lib(.*).a/$1/; + if ($objdefs{$_} ne "$libroot.o") { + print DEPENDS "$objdefs{$_}\n"; + } + } + } + close UNDEFS; + close DEPENDS; + open DF, "<GenLibDeps.out"; + while (<DF>) { + chomp; + print " $_\n"; + } + close DF; + print " </dd>\n"; +} + +# Make sure we flush on write. This is slower but correct based on the way we +# write I/O in gen_one_entry. +$| = 1; + +# Print the definition list tag +print "<dl>\n"; + +# Print libraries first +foreach $lib (@libs) { + gen_one_entry($lib); +} + +# Print objects second +foreach $obj (@objs) { + gen_one_entry($obj); +} + +# Print end tag of definition list element +print "</dl>\n"; |