AIX 64-bit patches from Steven Hirsch <hirschs@btv.ibm.com>
Jarkko Hietaniemi [Mon, 28 Feb 2000 16:23:15 +0000 (16:23 +0000)]
The patch to File/Glob/Makefile.PL is inconvenient but at the
moment necessary: adding an ext/FIle/Glob/hints/aix.pl to turn
off the optimization ($self->{OPTIMIZE} = '') doesn't work,
the file is processed by MakeMaker but OPTIMIZE ends up as -O
in the resulting Makefile.  A MakeMaker bug?

p4raw-id: //depot/cfgperl@5323

ext/DynaLoader/dl_aix.xs
ext/File/Glob/Makefile.PL
hints/aix.sh
t/lib/ipc_sysv.t

index f845681..0a92af7 100644 (file)
 #include "perl.h"
 #include "XSUB.h"
 
+/* When building as a 64-bit binary on AIX, define this to get the
+ * correct structure definitions.  Also determines the field-name
+ * macros and gates some logic in readEntries().  -- Steven N. Hirsch
+ * <hirschs@btv.ibm.com> */
+#ifdef USE_64_BIT_ALL
+#   define __XCOFF64__
+#   define __XCOFF32__
+#endif
+
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
 #include <a.out.h>
 #include <ldfcn.h>
 
+#ifdef USE_64_BIT_ALL
+#   define AIX_SCNHDR SCNHDR_64
+#   define AIX_LDHDR LDHDR_64
+#   define AIX_LDSYM LDSYM_64
+#   define AIX_LDHDRSZ LDHDRSZ_64
+#else
+#   define AIX_SCNHDR SCNHDR
+#   define AIX_LDHDR LDHDR
+#   define AIX_LDSYM LDSYM
+#   define AIX_LDHDRSZ LDHDRSZ
+#endif
+
 /* When using Perl extensions written in C++ the longer versions
  * of load() and unload() from libC and libC_r need to be used,
  * otherwise statics in the extensions won't get initialized right.
@@ -394,10 +415,10 @@ static int readExports(ModulePtr mp)
 {
        dTHX;
        LDFILE *ldp = NULL;
-       SCNHDR sh;
-       LDHDR *lhp;
+       AIX_SCNHDR sh;
+       AIX_LDHDR *lhp;
        char *ldbuf;
-       LDSYM *ls;
+       AIX_LDSYM *ls;
        int i;
        ExportPtr ep;
 
@@ -463,7 +484,11 @@ static int readExports(ModulePtr mp)
                        return -1;
                }
        }
+#ifdef USE_64_BIT_ALL
+       if (TYPE(ldp) != U803XTOCMAGIC) {
+#else
        if (TYPE(ldp) != U802TOCMAGIC) {
+#endif
                errvalid++;
                strcpy(errbuf, "readExports: bad magic");
                while(ldclose(ldp) == FAILURE)
@@ -511,8 +536,8 @@ static int readExports(ModulePtr mp)
                        ;
                return -1;
        }
-       lhp = (LDHDR *)ldbuf;
-       ls = (LDSYM *)(ldbuf+LDHDRSZ);
+       lhp = (AIX_LDHDR *)ldbuf;
+       ls = (AIX_LDSYM *)(ldbuf+AIX_LDHDRSZ);
        /*
         * Count the number of exports to include in our export table.
         */
@@ -536,15 +561,19 @@ static int readExports(ModulePtr mp)
         * the entry point we got from load.
         */
        ep = mp->exports;
-       ls = (LDSYM *)(ldbuf+LDHDRSZ);
+       ls = (AIX_LDSYM *)(ldbuf+AIX_LDHDRSZ);
        for (i = lhp->l_nsyms; i; i--, ls++) {
                char *symname;
                if (!LDR_EXPORT(*ls))
                        continue;
+#ifndef USE_64_BIT_ALL
                if (ls->l_zeroes == 0)
+#endif
                        symname = ls->l_offset+lhp->l_stoff+ldbuf;
+#ifndef USE_64_BIT_ALL
                else
                        symname = ls->l_name;
+#endif
                ep->name = savepv(symname);
                ep->addr = (void *)((unsigned long)mp->entry + ls->l_value);
                ep++;
index c82988f..98781c9 100644 (file)
@@ -9,3 +9,13 @@ WriteMakefile(
 #   DEFINE             => '-DGLOB_DEBUG',
 #   OPTIMIZE           => '-g',
 );
+use Config;
+sub MY::cflags {
+  package MY;
+  my $inherited = shift->SUPER::cflags(@_);
+  if ($Config::Config{archname} =~ /^aix/ and 
+      $Config::Config{use64bitall} eq 'define') {
+    $inherited =~ s/\s-O\d?//m;
+  }
+  $inherited;
+}
index 1029a36..6e8a4b3 100644 (file)
@@ -3,6 +3,7 @@
 # AIX 4.1 hints thanks to Christopher Chan-Nui <channui@austin.ibm.com>.
 # AIX 4.1 pthreading by Christopher Chan-Nui <channui@austin.ibm.com> and
 #        Jarkko Hietaniemi <jhi@iki.fi>.
+# AIX 4.3.x LP64 build by Steven Hirsch <hirschs@btv.ibm.com>
 # Merged on Mon Feb  6 10:22:35 EST 1995 by
 #   Andy Dougherty  <doughera@lafcol.lafayette.edu>
 
@@ -67,6 +68,31 @@ so="a"
 # Stephanie Beals <bealzy@us.ibm.com>
 dlext="so"
 
+# Take possible hint from the environment.  If 32-bit is set in the
+# environment, we can override it later.  If set for 64, the
+# 'sizeof' test sees a native 64-bit architecture and never looks back.
+case "$OBJECT_MODE" in
+32)
+    cat >&4 <<EOF
+
+You have OBJECT_MODE=32 set in the environment. 
+I take this as a hint you do not want to
+build for a 64-bit address space. You will be
+given the opportunity to change this later.
+EOF
+    ;;
+64)
+    cat >&4 <<EOF
+
+You have OBJECT_MODE=64 set in the environment. 
+This forces a full 64-bit build.  If that is
+not what you intended, please terminate this
+program, unset it and restart.
+EOF
+    ;;
+*)  ;;
+esac
+
 # Trying to set this breaks the POSIX.c compilation
 
 # Make setsockopt work correctly.  See man page.
@@ -197,7 +223,7 @@ case "$uselargefiles" in
        case "$lfcflags$lfldflags$lflibs" in
        '');;
        *) ccflags="$ccflags $lfcflags"
-          ldflags="$ldflags $ldldflags"
+          ldflags="$ldflags $lfldflags"
           libswanted="$libswanted $lflibs"
           ;;
        esac
@@ -217,13 +243,110 @@ $define|true|[yY]*)
            3.*|4.[012].*)
                cat >&4 <<EOM
 AIX `oslevel` does not support 64-bit interfaces.
-You should upgrade to at least AIX 4.2.
+You should upgrade to at least AIX 4.3.
 EOM
                exit 1
                ;;
            esac
-           # When a 64-bit cc becomes available $archname64
-           # may need setting so that $archname gets it attached.
+           ;;
+esac
+EOCBU
+
+# This script UU/use64bitall.cbu will get 'called-back' by Configure 
+# after it has prompted the user for whether to use full 64-bitness.
+cat > UU/use64bitall.cbu <<'EOCBU'
+case "$use64bitall" in
+$define|true|[yY]*)
+           case "`oslevel`" in
+           3.*|4.[012].*)
+               cat >&4 <<EOM
+AIX `oslevel` does not support 64-bit interfaces.
+You should upgrade to at least AIX 4.3.
+EOM
+               exit 1
+               ;;
+           esac
+           echo " "
+           echo "Checking the CPU width of your hardware..." >&4
+           $cat >size.c <<EOCP
+#include <stdio.h>
+#include <sys/systemcfg.h>
+int main (void)
+{
+  printf("%d\n",_system_configuration.width);
+  return(0);
+}
+EOCP
+           set size
+           if eval $compile_ok; then
+               lfcpuwidth=`./size`
+               echo "You are running on $lfcpuwidth bit hardware."
+           else
+               dflt="32"
+               echo " "
+               echo "(I can't seem to compile the test program.  Guessing...)"
+               rp="What is the width of your CPU (in bits)?"
+               . ./myread
+               lfcpuwidth="$ans"
+           fi
+           $rm -f size.c size
+           case "$lfcpuwidth" in
+           32*)
+               cat >&4 <<EOM
+Bzzzt! At present, you can only perform a
+full 64-bit build on a 64-bit machine.
+EOM
+               exit 1
+               ;;
+           esac
+           lfcflags="`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
+           lfldflags="`getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
+           # See jhi's comments above regarding this re-eval.  I've
+           # seen similar weirdness in the form of:
+           #
+# 1506-173 (W) Option lm is not valid.  Enter xlc for list of valid options.
+           #
+           # error messages from 'cc -E' invocation. Again, the offending
+           # string is simply not detectable by any means.  Since it doesn't
+           # do any harm, I didn't pursue it. -- sh
+           lfldflags="`echo $lfldflags`"
+           lflibs="`getconf XBS5_LP64_OFF64_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
+           # -q32 and -b32 may have been set by uselfs or user.  Remove them.
+           ccflags="`echo $ccflags | sed -e 's@-q32@@'`"
+           ldflags="`echo $ldflags | sed -e 's@-b32@@'`"
+           # Tell archiver to use large format.  Unless we remove 'ar'
+           # from 'trylist', the Configure script will just reset it to 'ar'
+           # immediately prior to writing config.sh.  This took me hours
+           # to figure out.
+           trylist="`echo $trylist | sed -e 's@^ar @@' -e 's@ ar @@g' -e 's@ ar$@@'`"
+           ar="ar -X64"
+           nm_opt="-X64 $nm_opt"
+           # Note: Placing the 'lfcflags' variable into the 'ldflags' string
+           # is NOT a typo.  ldlflags is passed to the C compiler for final
+           # linking, and it wants -q64 (-b64 is for ld only!).
+           case "$lfcflags$lfldflags$lflibs" in
+           '');;
+           *) ccflags="$ccflags $lfcflags"
+              ldflags="$ldflags $lfcflags"
+              lddlflags="$lfldflags $lddlflags"
+              libswanted="$libswanted $lflibs"
+              ;;
+           esac
+           case "$ccflags" in
+           *-DUSE_64_BIT_ALL*) ;;
+           *) ccflags="$ccflags -DUSE_64_BIT_ALL";;
+           esac
+           case "$archname64" in
+           ''|64*) archname64=64all ;;
+           esac
+           longsize="8"
+           # Don't try backwards compatibility
+           bincompat="$undef"
+           d_bincompat5005="$undef"
+           lfcflags=''
+           lfldflags=''
+           lflibs=''
+           lfcpuwidth=''
            ;;
 esac
 EOCBU
index 9777292..55d9ba1 100755 (executable)
@@ -81,9 +81,16 @@ if ($Config{'d_msgget'} eq 'define' &&
     my $test5bad;
     my $test6bad;
 
-    unless (msgsnd($msg,pack("L a*",$msgtype,$msgtext),IPC_NOWAIT)) {
+    if ($Config{'use64bitall'} eq 'define') {
+      unless (msgsnd($msg,pack("L L a*",0,$msgtype,$msgtext),IPC_NOWAIT)) {
        print "not ";
-         $test2bad = 1;
+       $test2bad = 1;
+      }
+    } else {
+      unless (msgsnd($msg,pack("L a*",$msgtype,$msgtext),IPC_NOWAIT)) {
+       print "not ";
+       $test2bad = 1;
+      }
     }
     print "ok 2\n";
     if ($test2bad) {
@@ -127,8 +134,12 @@ EOM
 EOM
     }
 
-    my($rmsgtype,$rmsgtext) = unpack("L a*",$msgbuf);
-
+    my($rmsgtype,$rmsgtext);
+    if ($Config{'use64bitall'} eq 'define') {
+      (undef,$rmsgtype,$rmsgtext) = unpack("L L a*",$msgbuf)
+    } else {
+      ($rmsgtype,$rmsgtext) = unpack("L a*",$msgbuf)
+    }
     unless($rmsgtype == $msgtype && $rmsgtext eq $msgtext) {
        print "not ";
        $test6bad = 1;