Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2006-03-01 23:20:22 +0300
committerChristopher Faylor <me@cgf.cx>2006-03-01 23:20:22 +0300
commitee93375872d33a3c4518cda416315f8ea844f5ab (patch)
treeef15cb568d894adc1827393aab9c5f05d62bce2e /winsup/cygwin/analyze_sigfe
parent3b1f276fca026267c148ee1b4738db224f3f4186 (diff)
* analyze_sigfe: New script.
* dllfixdbg: Add copyright. * gendef: Ditto. * gendevices: Ditto. * gentls_offsets: Ditto.
Diffstat (limited to 'winsup/cygwin/analyze_sigfe')
-rwxr-xr-xwinsup/cygwin/analyze_sigfe80
1 files changed, 80 insertions, 0 deletions
diff --git a/winsup/cygwin/analyze_sigfe b/winsup/cygwin/analyze_sigfe
new file mode 100755
index 000000000..0b9b7219f
--- /dev/null
+++ b/winsup/cygwin/analyze_sigfe
@@ -0,0 +1,80 @@
+#!/usr/bin/perl -s
+# Copyright 2006 Red Hat, Inc.
+#
+# This file is part of Cygwin.
+#
+# This software is a copyrighted work licensed under the terms of the
+# Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+# details.
+
+# This will do a crude test to see if the (NO)?SIGFE stuff is used properly
+# in cygwin.din. It is not perfect so do not use it to do a wholesale replacement.
+#
+# Input is the output of 'objdump --disassemble --demangle cygwin0.dll'.
+#
+use strict;
+use vars qw'$v';
+sub star($);
+
+my %funcs;
+my $func = '';
+
+$| = 1;
+while (<>) {
+ /^610.....\s+<([^\(>]+).*?:/o and do {
+ $func = $1;
+ $funcs{$func} = {} unless defined $funcs{$func};
+ next;
+ };
+ $func and /call\s+\S+\s+<([^\(>]+)/o and do {
+ my $called = $1;
+ $funcs{$func}{$called} = 1;
+ if ($called =~ /^[A-Z].*@/o || ($called = $funcs{$called}{-uses_kernel})) {
+ $funcs{$func}{-uses_kernel} ||= $called;
+ my @a = ($func);
+ while (my $f = shift @a) {
+ for my $k (keys %funcs) {
+ if ($funcs{$k}{$f} && !$funcs{$k}{-uses_kernel}) {
+ $funcs{$k}{-uses_kernel} = $called;
+ push(@a, $k);
+ }
+ }
+ }
+ }
+ next;
+ };
+}
+
+if ($v) {
+ for my $k (sort keys %funcs) {
+ print star($funcs{$k}), $k, $funcs{$k}{-uses_kernel} ? " ($funcs{$k}{-uses_kernel})\n" : "\n";
+ my $indent = ' ';
+ for (sort keys %{$funcs{$k}}) {
+ next if /^-/o;
+ print $indent, $_, star($funcs{$k});
+ $indent = ' ';
+ }
+ print "\n";
+ }
+}
+
+open(DIN, '<', 'cygwin.din') or die "$0: couldn't open cygwin.din - $!\n";
+while (<DIN>) {
+ my $line = $_;
+ /^LIBRARY\s+/o and next;
+ /^\s*$/ and next;
+ /^EXPORTS/o and next;
+ / DATA$/o and next;
+ my $sigfe = (/\s+((?:NO)?SIGFE)\s*$/o)[0] !~ /^NO/o;
+ s/\s+((?:NO)?SIGFE)\s*$//o;
+ my $func = (/\s+=\s+(\S+)/o)[0] || (/^\s*(\S+)/o)[0];
+ if (!defined($funcs{$func})) {
+ warn "hmm. couldn't find $func in disassembled output\n";
+ } elsif (!!$funcs{$func}{-uses_kernel} != $sigfe) {
+ warn "mismatch detected: $line";
+ }
+}
+
+sub star($) {
+ return $_[0]->{-uses_kernel} ? '*' : '';
+}