+dttypes
[massrebuild.git] / dttypes
diff --git a/dttypes b/dttypes
new file mode 100755 (executable)
index 0000000..10e15c0
--- /dev/null
+++ b/dttypes
@@ -0,0 +1,36 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+my $savedtot=0;
+@ARGV=glob "build/*.dttypes" if !@ARGV;
+for my $fn (@ARGV) {
+  local *F;
+  open F,$fn or die $fn;
+  my %H;
+  my $saved=0;
+  my $valid;
+  while (<F>) {
+    chomp;
+    next if $_ eq "";
+    next if $_ eq ".debug_types contents:";
+    if (m{:\tfile format (\S+)$}) {
+      $valid=($1 eq "ELF64-x86-64");
+      next;
+    }
+    die "$fn:$.: $_" if !m{^name = '.*' type_signature = 0x([0-9a-f]{16}) length = (0x[0-9a-f]{8})$};
+    next if !$valid;
+    my $sig=$1;
+    my $len=eval($2)+4;
+    my $ref=\$H{$sig};
+    if (!$$ref) {
+      $$ref=$len;
+      next;
+    }
+#    warn "$fn:$.: $sig: $len != $$ref" if $len!=$$ref;
+    $saved+=$len;
+  }
+  close F or die $fn;
+  print "$saved $fn\n" if $saved;
+  $savedtot+=$saved;
+}
+print "$savedtot\n";