Add helper functions to ConstantInt and ConstantFP to accept strings.
[oota-llvm.git] / utils / GenLibDeps.pl
index 419d8f92d866d62cf43d074f8d702a8cbfa924f7..6d0b13ee4361eb5183bf417f5b03c1d50d5580c3 100755 (executable)
@@ -8,6 +8,7 @@
 #
 # Syntax:   GenLibDeps.pl [-flat] <directory_with_libraries_in_it> [path_to_nm_binary]
 #
+use strict;
 
 # Parse arguments... 
 my $FLAT = 0;
@@ -37,6 +38,10 @@ if (!$FLAT) {
   die "Can't find 'dot'" if (! -x "$DotPath");
 }
 
+if (defined($ENV{NM})) {
+  chomp($nmPath=$ENV{NM});
+}
+
 if (!defined($nmPath) || $nmPath eq "") {
   chomp($nmPath=`which nm`);
   die "Can't find 'nm'" if (! -x "$nmPath");
@@ -47,8 +52,8 @@ if (!defined($nmPath) || $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.*\.(dylib|so|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.
@@ -56,25 +61,29 @@ 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 (<DEFS>) {
-    chomp($_);
+    next if (! / [ABCDGRST] /);
+    s/^[^ ]* [ABCDGRST] //;    
+    s/\015?\012//; # not sure if <DEFS> is in binmode and uses LF or CRLF.
+                   # this strips both LF and CRLF.
     $libdefs{$_} = $lib;
   }
-  close DEFS;
+  close DEFS or die "nm failed";
 }
 
 # 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 (<DEFS>) {
-    chomp($_);
+    next if (! / [ABCDGRST] /);
+    s/^[^ ]* [ABCDGRST] //;
+    s/\015?\012//; # not sure if <DEFS> is in binmode and uses LF or CRLF.
+                   # this strips both LF and CRLF.    
     $objdefs{$_} = $obj;
   }
-  close DEFS;
+  close DEFS or die "nm failed";
 }
 
 # Generate one entry in the <dl> list. This generates the <dt> and <dd> elements
@@ -91,7 +100,7 @@ sub gen_one_entry {
     print "  <dt><b>$lib</b</dt><dd><ul>\n";
   }
   open UNDEFS, 
-    "$nmPath -g -u $Directory/$lib | sed -e 's/^  *U //' | sort | uniq |";
+    "$nmPath -u $Directory/$lib | sed -e 's/^[ 0]* U //' | sort | uniq |";
   my %DepLibs;
   while (<UNDEFS>) {
     chomp;
@@ -100,7 +109,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{$_}};
@@ -108,21 +117,48 @@ sub gen_one_entry {
       }
     }
   }
-  close UNDEFS;
+  close UNDEFS or die "nm failed";
+  unless(keys %DepLibs) {
+    # above failed
+    open UNDEFS, "$nmPath -u $Directory/$lib |";
+    while (<UNDEFS>) {
+      # to bypass non-working sed
+      if ('  ' eq substr($_,0,2) and index($_,'U ')) {
+        $_ = substr($_,index($_,'U ')+2)
+      };
+      $_ = substr($_,index($_,'  *U ')+5) if -1!=index($_,'  *U ');
+
+      chomp;
+      my $lib_printed = 0;
+      if (defined($libdefs{$_}) && $libdefs{$_} ne $lib) {
+        $DepLibs{$libdefs{$_}} = [] unless exists $DepLibs{$libdefs{$_}};
+        push(@{$DepLibs{$libdefs{$_}}}, $_);
+      } elsif (defined($objdefs{$_}) && $objdefs{$_} ne $lib) {
+        my $libroot = $lib;
+        $libroot =~ s/lib(.*).a/$1/;
+        if ($objdefs{$_} ne "$libroot.o") {
+          $DepLibs{$objdefs{$_}} = [] unless exists $DepLibs{$objdefs{$_}};
+          push(@{$DepLibs{$objdefs{$_}}}, $_);
+        }
+      }
+    }
+    close UNDEFS or die "nm failed";
+  }
+
   for my $key (sort keys %DepLibs) {
     if ($FLAT) {
       print " $key";
       if ($WHY) {
         print "\n";
         my @syms = @{$DepLibs{$key}};
-        foreach $sym (@syms) {
+        foreach my $sym (@syms) {
           print "  $sym\n";
         }
       }
     } else {
       print "    <li>$key</li>\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" };
@@ -169,7 +205,7 @@ if (!$FLAT) {
 }
 
 # Print libraries first
-foreach $lib (@libs) {
+foreach my $lib (@libs) {
   gen_one_entry($lib);
 }
 
@@ -196,7 +232,7 @@ if (!$FLAT) {
 }
 
 # Print objects second
-foreach $obj (@objs) {
+foreach my $obj (@objs) {
   gen_one_entry($obj);
 }