tbuild: OS X 64-bit build - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit fc567f476a9cb381a50a94a355c4e0dd990b2539
parent babe3439cc2bb8baa027be65da67d02d980ebb05
Author: Russ Cox 
Date:   Tue,  2 Aug 2011 14:28:04 -0400

build: OS X 64-bit build

R=rsc
http://codereview.appspot.com/4838047

Diffstat:
  M INSTALL                             |      22 ++++++++++++++++++++--
  M bin/9a                              |      12 +++++++++---
  M bin/9c                              |       2 ++
  M bin/9l                              |       3 +++
  M src/lib9/ctime.c                    |       2 +-
  M src/libthread/mkfile                |       4 +---
  M src/libthread/sysofiles.sh          |      14 ++++----------
  M src/libthread/test/tprimes.c        |       1 +
  M src/libthread/thread.c              |       7 ++++++-
  M src/libthread/threadimpl.h          |      19 +++++++++++++++----
  M src/mkhdr                           |       1 +

11 files changed, 63 insertions(+), 24 deletions(-)
---
diff --git a/INSTALL b/INSTALL
t@@ -54,14 +54,32 @@ if [ `uname` = Linux ]; then
         if ./a.out >/dev/null
         then        
                 echo "        NPTL found."
-                echo "SYSVERSION=2.6.x" >$PLAN9/config
+                echo "SYSVERSION=2.6.x" >>$PLAN9/config
         else
                 echo "        NPTL not found."
-                echo "SYSVERSION=2.4.x" >$PLAN9/config
+                echo "SYSVERSION=2.4.x" >>$PLAN9/config
         fi
         rm -f ./a.out
 fi
 
+if [ `uname` = Darwin ]; then
+        # On Darwin, uname -m -p cannot be trusted.
+        echo "* Running on Darwin: checking architecture..."
+        rm -f ./a.out
+        gcc lib/darwin-main.c >/dev/null 2>&1
+        case "$(file ./a.out 2>/dev/null)" in
+        *x86_64*)
+                echo "        x86-64 found."
+                echo "OBJTYPE=x86_64" >>$PLAN9/config
+                ;;
+        *i386*)
+                echo "        i386 found."
+                echo "OBJTYPE=386" >>$PLAN9/config
+                ;;
+        esac
+        rm -f ./a.out
+fi
+
 if [ -f LOCAL.config ]; then
         echo Using LOCAL.config options:
         sed 's/^/        /' LOCAL.config
diff --git a/bin/9a b/bin/9a
t@@ -5,10 +5,16 @@ if [ $# != 1 ]; then
         exit 1
 fi
 
+test -f $PLAN9/config && . $PLAN9/config
+
 aflags=""
-case "`uname`" in
-Darwin)
-        aflags="-arch `arch`"
+case "`uname`-${OBJTYPE:-`uname -m`}" in
+Darwin-*386*)
+        aflags="-arch i386"
+        ;;
+Darwin-*x86_64*)
+        aflags="-arch x86_64"
+        ;;
 esac
 
 out=`echo $1 | sed 's/\.s$//;s/$/.o/'`
diff --git a/bin/9c b/bin/9c
t@@ -70,6 +70,8 @@ case "$tag" in
 *FreeBSD*gcc*)        usegcc ;;
 *FreeBSD*clang*)        useclang ;;
 *BSD*)        usegcc ;;
+*Darwin-x86_64*) usegcc
+                cflags="$ngflags -g3 -no-cpp-precomp -m64" ;;
 *Darwin*)        usegcc 
                 cflags="$ngflags -g3 -no-cpp-precomp -m32" ;;
 *HP-UX*)        cc=${CC9:-cc}; cflags="-g -O -c -Ae" ;;
diff --git a/bin/9l b/bin/9l
t@@ -45,6 +45,9 @@ case "$tag" in
                 ;;
         esac
         ;;
+*Darwin*x86_64*)
+        ld="${CC9:-gcc} -m64"
+        ;;
 *Darwin*)
         ld="${CC9:-gcc} -m32"
         ;;
diff --git a/src/lib9/ctime.c b/src/lib9/ctime.c
t@@ -130,7 +130,7 @@ gmtime(long tim)
 char*
 asctime(Tm *t)
 {
-        char *ncp;
+        const char *ncp;
         static char cbuf[30];
 
         strcpy(cbuf, "Thu Jan 01 00:00:00 GMT 1970\n");
diff --git a/src/libthread/mkfile b/src/libthread/mkfile
t@@ -52,6 +52,4 @@ test:V: tprimes tspawn
         echo tspawn should take 3 seconds, not 6
         $PLAN9/bin/time ./tspawn sleep 3 >/dev/null
 
-CLEANFILES=p1.txt p2.txt tp1.txt tp2.txt
-
-
+CLEANFILES=p1.txt p2.txt tp1.txt tp2.txt test/*.$O
diff --git a/src/libthread/sysofiles.sh b/src/libthread/sysofiles.sh
t@@ -4,24 +4,18 @@ test -f $PLAN9/config && . $PLAN9/config
 
 tag="$OBJTYPE-$SYSNAME-${SYSVERSION:-`uname -r`}-${CC9:-cc}"
 case "$tag" in
-*-Linux-2.6.*)
-        echo pthread.o
-        ;;
-*-FreeBSD-[5-9].*)
-        echo pthread.o
-        ;;
-*-Linux-*)
+*-Linux-2.[0-5]*)
         # will have to fix this for linux power pc
         echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME.o
         ;;
-*-FreeBSD-*)
+*-FreeBSD-[0-4].*)
         echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME.o
         ;;
 *-NetBSD-*)
         echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME.o
         ;;
-*-Darwin-*)
-        echo ${SYSNAME}-${OBJTYPE}-asm.o ${SYSNAME}-${OBJTYPE}.o pthread.o
+*-Darwin-10.[5-6].*)
+        echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME-${OBJTYPE}.o pthread.o
         ;;
 *-OpenBSD-*)
         echo ${SYSNAME}-${OBJTYPE}-asm.o ${SYSNAME}-${OBJTYPE}.o $SYSNAME.o
diff --git a/src/libthread/test/tprimes.c b/src/libthread/test/tprimes.c
t@@ -80,6 +80,7 @@ threadmain(int argc, char **argv)
         mk(countthread, c, STACK);
         mk(filterthread, c, STACK);
         recvp(chancreate(sizeof(void*), 0));
+        threadexitsall(0);
 }
 
 void
diff --git a/src/libthread/thread.c b/src/libthread/thread.c
t@@ -91,7 +91,7 @@ threadstart(uint y, uint x)
         z |= y;
         t = (_Thread*)z;
 
-/*print("threadstart %p\n", v); */
+//print("threadstart sp=%p arg=%p startfn=%p t=%p\n", &t, t, t->startfn, t->startarg);
         t->startfn(t->startarg);
 /*print("threadexits %p\n", v); */
         threadexits(nil);
t@@ -114,17 +114,21 @@ threadalloc(void (*fn)(void*), void *arg, uint stack)
         t->stk = (uchar*)(t+1);
         t->stksize = stack;
         t->id = incref(&threadidref);
+//print("fn=%p arg=%p\n", fn, arg);
         t->startfn = fn;
         t->startarg = arg;
+//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn);
 
         /* do a reasonable initialization */
         memset(&t->context.uc, 0, sizeof t->context.uc);
         sigemptyset(&zero);
         sigprocmask(SIG_BLOCK, &zero, &t->context.uc.uc_sigmask);
+//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn);
 
         /* must initialize with current context */
         if(getcontext(&t->context.uc) < 0)
                 sysfatal("threadalloc getcontext: %r");
+//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn);
 
         /* call makecontext to do the real work. */
         /* leave a few words open on both ends */
t@@ -141,6 +145,7 @@ threadalloc(void (*fn)(void*), void *arg, uint stack)
          * function that takes some number of word-sized variables,
          * and on 64-bit machines pointers are bigger than words.
          */
+//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn);
         z = (ulong)t;
         y = z;
         z >>= 16;        /* hide undefined 32-bit shift from 32-bit compilers */
diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h
t@@ -24,7 +24,7 @@ extern        int                swapcontext(ucontext_t*, ucontext_t*);
 extern        void                makecontext(ucontext_t*, void(*)(), int, ...);
 #endif
 
-#if defined(__APPLE__)
+#if defined(__APPLE__) && !defined(__x86_64__)
         /*
          * OS X before 10.5 (Leopard) does not provide
          * swapcontext nor makecontext, so we have to use our own.
t@@ -40,8 +40,10 @@ extern        void                makecontext(ucontext_t*, void(*)(), int, ...);
 #        define makecontext libthread_makecontext
 #        if defined(__i386__)
 #                include "386-ucontext.h"
-#        else
+#        elif defined(__power__)
 #                include "power-ucontext.h"
+#        else
+#                error "unknown architecture"
 #        endif
 #endif
 
t@@ -99,6 +101,15 @@ enum
 struct Context
 {
         ucontext_t        uc;
+#ifdef __APPLE__
+        /*
+         * On Snow Leopard, etc., the context routines exist,
+         * so we use them, but apparently they write past the
+         * end of the ucontext_t.  Sigh.  We put some extra
+         * scratch space here for them.
+         */
+        uchar        buf[512];
+#endif
 };
 
 struct Execjob
t@@ -116,12 +127,12 @@ struct _Thread
         _Thread        *allnext;
         _Thread        *allprev;
         Context        context;
+        void        (*startfn)(void*);
+        void        *startarg;
         uint        id;
         uchar        *stk;
         uint        stksize;
         int                exiting;
-        void        (*startfn)(void*);
-        void        *startarg;
         Proc        *proc;
         char        name[256];
         char        state[256];
diff --git a/src/mkhdr b/src/mkhdr
t@@ -38,5 +38,6 @@ YFLAGS=-d
 LIB=
 SHORTLIB=9
 
+<|cat $PLAN9/config 2>/dev/null || true
 <|cat $PLAN9/src/mk.$SYSNAME-$OBJTYPE 2>/dev/null || true