[RFC,4/9] Add pass to filter symbols
Commit Message
Currently symbol lists can be applied at the point of
extraction (abidw) or comparison (abidiff). This commmit enables
symbol lists to be applied directly to ABI XML files which will
simplify workflows that use multiple symbol lists.
* scripts/abitidy.pl (symbols): New variable to hold optional
symbols to filter by. (filter_symbols): New function to filter
out unlisted symbols.
Signed-off-by: Giuliano Procida <gprocida@google.com>
---
scripts/abitidy.pl | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
@@ -347,14 +347,35 @@ seen = $count_seen
remove_unwanted($dom);
}
+# Read symbols from a file.
+sub read_symbols($file) {
+ my %symbols;
+ my $fh = new IO::File $file, '<';
+ while (<$fh>) {
+ chomp;
+ $symbols{$_} = undef;
+ }
+ close $fh;
+ return \%symbols;
+}
+
+# Remove unlisted ELF symbols,
+sub filter_symbols($symbols, $dom) {
+ for my $node ($dom->findnodes('elf-symbol')) {
+ remove_node($node) unless exists $symbols->{$node->getAttribute('name')};
+ }
+}
+
# Parse arguments.
my $input_opt;
my $output_opt;
+my $symbols_opt;
my $all_opt;
my $drop_opt;
my $prune_opt;
GetOptions('i|input=s' => \$input_opt,
'o|output=s' => \$output_opt,
+ 's|symbols=s' => \$symbols_opt,
'a|all' => sub {
$drop_opt = $prune_opt = 1
},
@@ -364,6 +385,7 @@ GetOptions('i|input=s' => \$input_opt,
map { (' ', $_) } (
'[-i|--input file]',
'[-o|--output file]',
+ '[-s|--symbols file]',
'[-a|--all]',
'[-d|--[no-]drop-empty]',
'[-p|--[no-]prune-unreachable]',
@@ -379,6 +401,9 @@ close $input;
# This simplifies DOM analysis and manipulation.
strip_text($dom);
+# Remove unlisted symbols.
+filter_symbols(read_symbols($symbols_opt), $dom) if defined $symbols_opt;
+
# Prune unreachable elements.
prune_unreachable($dom) if $prune_opt;