source: branches/gcc/SOURCE_TOOLS/filter_defined_symbols.pl

Last change on this file was 19810, checked in by westram, 3 weeks ago
  • Property svn:executable set to *
File size: 2.7 KB
Line 
1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6sub cmd2arr($\@) {
7  my ($cmd, $arr_r) = @_;
8  print STDERR "[Action: '$cmd']\n";
9  open(CMD, $cmd.'|') || die "failed to fork '$cmd' (Reason: $!)";
10  my $line;
11  while (defined($line=<CMD>)) {
12    chomp($line);
13    push @$arr_r, $line;
14  }
15  close(CMD) || die "failed to execute '$cmd' (Reason: $! exitcode=$?)";
16}
17
18# @@@ two nm calls below: (1) undefined only (2) defined + extern only
19
20my $COMMON_NM_OPTIONS = "--demangle --format=posix";
21
22sub list_undefined($\@) {
23  my ($source, $arr_r) = @_;
24  my $cmd = "nm $COMMON_NM_OPTIONS --undefined-only $source";
25  cmd2arr($cmd,@$arr_r);
26}
27
28sub list_defined($\@) {
29  my ($source, $arr_r) = @_;
30  my $cmd = "nm $COMMON_NM_OPTIONS --defined-only --extern-only $source";
31  cmd2arr($cmd,@$arr_r);
32}
33
34sub die_usage($) {
35  my ($msg) = @_;
36
37  # @@@ update help: this is not only for objects, but also for libraries and executables. use term 'ARTIFACT' instead.
38
39  print STDERR "Usage: filter_defined_symbols.pl OBJECT1 OBJECT2 [ ... OBJECTN ]\n";
40  print STDERR "Test whether OBJECT2 ... OBJECTN define all symbols which are required by (=undefined in) OBJECT1\n";
41  print STDERR "List all symbols which are required by (=undefined in) OBJECT1 and\n";
42  print STDERR "are not defined in OBJECT2 ... OBJECTN\n";
43
44  die $msg."\n";
45}
46
47sub eliminate_defined(\@\@\@) {
48  my ($undefined_r, $defined_r, $notresolved_r) = @_;
49
50  my %undefined = map { if (/ U /o) { $` => $_; } else { ; } } @$undefined_r;
51  die "nothing undefined (probably broken)" if not scalar(%undefined);
52
53  my %defined = ();
54  foreach (@$defined_r) {
55    if (/ [TB] /o) {
56      my $sym = $`;
57      if (exists $undefined{$sym}) {
58        $defined{$sym} = 1;
59      }
60    }
61  }
62
63  foreach (keys %undefined) {
64    if (not exists $defined{$_}) {
65      push @$notresolved_r, $undefined{$_};
66    }
67  }
68
69}
70
71sub filter_defined_symbols() {
72  my $args = scalar(@ARGV);
73  if ($args < 2) {
74    die_usage("Missing arguments");
75  }
76  else {
77    my $OBJECT1 = shift @ARGV;
78    my $OBJECT2 = shift @ARGV;
79
80    my @undefined = (); # undefined symbols from OBJECT1
81    my @defined = ();   # defined symbols from OBJECT2
82
83    list_undefined($OBJECT1, @undefined);
84    list_defined($OBJECT2, @defined);
85
86    my @notresolved = ();
87
88    eliminate_defined(@undefined, @defined, @notresolved);
89
90    while (scalar(@ARGV)) {
91      my $OBJECTN = shift @ARGV;
92
93      if (not scalar(@notresolved)) {
94        die "no notresolved symbols left (before considering '$OBJECTN')";
95      }
96
97      @undefined = @notresolved;
98      @defined = ();
99
100      list_defined($OBJECTN, @defined);
101
102      @notresolved = ();
103      eliminate_defined(@undefined, @defined, @notresolved);
104    }
105
106    foreach (sort @notresolved) {
107      print $_."\n";
108    }
109  }
110}
111
112filter_defined_symbols();
Note: See TracBrowser for help on using the repository browser.