]> git.sesse.net Git - rdpsrv/blobdiff - Xserver/config/util/elistgen.ibm
Import X server from vnc-3.3.7.
[rdpsrv] / Xserver / config / util / elistgen.ibm
diff --git a/Xserver/config/util/elistgen.ibm b/Xserver/config/util/elistgen.ibm
new file mode 100644 (file)
index 0000000..b1f99d1
--- /dev/null
@@ -0,0 +1,220 @@
+XCOMM!/bin/sh
+XCOMM $XConsortium: elistgen.ibm /main/2 1996/12/04 10:13:18 swick $
+XCOMM
+XCOMM #########################################################################
+XCOMM Construct shared-library export lists for IBM-AIX based on standardized
+XCOMM export list description file
+XCOMM
+XCOMM Usage: elistgen libfoo.sl libfoo.elist > libfoo.lopt
+XCOMM
+XCOMM  libfoo.a     => shared library of interest
+XCOMM  libfoo.elist => Meta description of necessary export list.
+XCOMM
+XCOMM    The output file, "libfoo.lopt" may then be passed to the IBM linker to 
+XCOMM    reconstruct the shared library, libfoo.sl.
+XCOMM
+XCOMM Author: Yanling Qi 10/03/94, Last updated 10/03/94
+XCOMM (c) Copyright 1996 Digital Equipment Corporation.
+XCOMM (c) Copyright 1996 Hewlett-Packard Company.
+XCOMM (c) Copyright 1994,1996 International Business Machines Corp.
+XCOMM (c) Copyright 1996 Sun Microsystems, Inc.
+XCOMM (c) Copyright 1996 Novell, Inc. 
+XCOMM (c) Copyright 1996 FUJITSU LIMITED.
+XCOMM (c) Copyright 1996 Hitachi.
+XCOMM
+XCOMM #########################################################################
+
+#define HASH #
+
+XCOMM Utility programs
+FILTER=CXXFILT                 # C++ symbol demangler
+AWK=awk                                # awk
+
+XCOMM For dump, cat, pr, expand, awk, c++filt
+PATH=/usr/bin:/bin:/usr/ucb:/usr/lpp/xlC/bin
+
+XCOMM Temporary files
+EXPORTLIST=/tmp/elistgen1.$$   # export directives from "libfoo.list"
+NMLIST=/tmp/elistgen2.$$       # name list from libfoo.sl
+FILTLIST=/tmp/elistgen3.$$     # demangled (C++) version of above
+
+XCOMM Print useful information
+echo "*" `date`
+echo "* This linker options list was produced by" $0
+echo "* Input export list description taken from:" $2
+echo "* Target library:" $1
+echo "* Target Operating System:" `uname`
+echo "*"
+
+XCOMM Extract the globally visible symbols from target library
+dump -g $1 | $AWK  '$1 ~ /[0-9][0-9]/ && $2 !~ /^[\.]/ {print $2}' > $NMLIST
+
+XCOMM Demangle the global library symbols
+${FILTER:-cat} $NMLIST > $FILTLIST
+
+XCOMM
+XCOMM Clean up the export-list description file.
+XCOMM Note that C++ symbols may have embedded spaces in them.
+XCOMM
+$AWK '
+    BEGIN {
+       csyms     = 0;          # C   language symbols in libfoo.list
+       cplusplus = 0;          # C++ language symbols in libfoo.list
+       isyms     = 0;          # C   internal symbols in libfoo.list
+       iplusplus = 0;          # C++ internal symbols in libfoo.list
+       count     = 0;          # Running count of symbols
+       implicit  = "";         # Handling of implicit symbols.
+    }
+    $1 == "default" {
+       HASH A default clause suppresses warnings about implicit symbols.
+       if ($2 != "" && $2 != "force" && $2 != "public" && 
+           $2 != "private" && $2 != "internal") {
+           print "# Warning: illegal default clause:", $2 | "cat 1>&2";
+           next;
+       }
+       if (implicit != "")
+           print "# Warning: multiple default clauses." | "cat 1>&2";
+        implicit = $2;
+       next;
+    }
+    $1 == "force" || $1 == "public" || $1 == "private" {
+       csyms ++;
+       symbol[count++] = $1 ";;" $2;
+       next;
+    }
+    $1 == "publicC++" || $1 == "privateC++" {
+       HASH forceC++ is unsupported because we only know how to demangle,
+       HASH not how to mangle symbols, and the final ld input file must
+       HASH be mangled.
+       cplusplus ++;
+       string = $2;
+       for (n = 3; n <= NF; n++)
+           string = string " " $n;
+       symbol[count++] = $1 ";;" string;
+       next;
+    }
+    $1 == "internal" {
+       isyms ++;
+       symbol[count++] = $1 ";;" $2;
+       next;
+    }
+    $1 == "internalC++" {
+       iplusplus ++;
+       string = ";;" $2;
+       for (n = 3; n <= NF; n++)
+           string = string " " $n;
+       symbol[count++] = $1 ";;" string;
+       next;
+    }
+    $1 == "#line" || $1 == "#" {
+       HASH cpp will have removed comments, but may have added other stuff.
+       next;
+    }
+    NF > 0 {
+       print "# Warning: unrecognized directive:", $0 | "cat 1>&2";
+       next;
+    }
+    END  {
+       printf("# Exporting %d C and %d C++ symbols, hiding %d and %d.\n",
+              csyms, cplusplus, isyms, iplusplus) | "cat 1>&2";
+       if (implicit != "") {
+           print "# Unspecified symbols are " implicit "." | "cat 1>&2";
+           print "default;;" implicit;
+       }
+       for (i in symbol)
+           print symbol[i];
+    }
+' $2 > $EXPORTLIST
+
+XCOMM
+XCOMM Read in the above files and write result to stdout.  Use the
+XCOMM delimiter ";" to identify the entries in the symbol lookup table.
+XCOMM
+(pr -m -s";" -t -w1024 $NMLIST $FILTLIST | expand -t 1; cat $EXPORTLIST) | $AWK '
+    BEGIN {
+       FS = ";";
+       implicit = 0;
+    }
+    NF == 2 {
+       HASH This is "pr" output, i.e., symbol translation table
+       r2=$2
+       gsub(/ /,"",r2);       # Remove spaces because c++filt is unpredictable
+       syms[r2] = $1;
+       r1=$1;
+       gsub(/ /,"",r1);
+       mangled[r1] = 1;       # Save the mangling because the export lists
+                              HASH sometimes use it instead of a prototype.
+       next;
+    }
+    NF == 3 && $1 == "default" {
+       HASH Treatment of unspecified symbols.
+       if ($3 == "internal")
+           implicit = 1;
+       else if ($3 == "private" || $3 == "privateC++")
+           implicit = 2;
+       else if ($3 == "public" || $3 == "publicC++")
+           implicit = 3;
+       else # $3 == "force"
+           implicit = 4;
+        next;
+    }
+    NF == 3 {
+       HASH Generate canonical demangled form as an alternate symbol.
+       alt=$3;
+       gsub(/ \.\.\./,",...",alt); # change " ..." to ",..." to match c++filt
+       gsub(/ /,"",alt);           # remove all spaces
+       gsub(/\(void\)/,"()",alt);  # change "(void)" to "()" to match c++filt
+
+       HASH Parse our instructions for this symbol.
+       if ($1 == "internal" || $1 == "internalC++")
+           export = 1;
+       else if ($1 == "private" || $1 == "privateC++")
+           export = 2;
+       else if ($1 == "public" || $1 == "publicC++")
+           export = 3;
+       else # $1 == "force"
+           export = 4;
+
+       HASH Process it.
+       if ((length(syms[alt]) > 0) || mangled[alt]) {
+           HASH This symbol is present in the library.
+           if (donelist[alt])
+               print "# Warning: Duplicate entry for", $3, 
+                   "in export list" | "cat 1>&2";
+           if (donelist[alt] < export) {
+               if (export > 1)
+                   print syms[alt];
+               donelist[alt] = export;
+           }
+       } else { 
+           HASH Print forced-export symbols without complaining.
+           if (export == 4) {
+               print alt;
+               donelist[alt] = export;
+           } else {
+               print "# Warning:", $3,
+                   "was not in the nm list for this library" | "cat 1>&2";
+           }
+       }
+
+       next;
+    }
+    END { 
+       HASH Process implicit symbols.
+       for (i in syms) {
+           if ((! donelist[i]) && (length(syms[i]) > 0)) {
+               HASH Do not complain about C++ virtual function tables.
+               if (implicit == 0 && syms[i] !~ /^__vft[0-9]*_/)
+                   print "# Warning:", syms[i],
+                       "was not in the export list" | "cat 1>&2";
+               if (implicit > 1)
+                   print syms[i];
+           }
+       }
+    }
+'
+
+XCOMM Clean up temporary files
+rm $EXPORTLIST
+rm $NMLIST
+rm $FILTLIST