tbuild: OS X 64-bit build - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit fc567f476a9cb381a50a94a355c4e0dd990b2539
 (DIR) parent babe3439cc2bb8baa027be65da67d02d980ebb05
 (HTM) Author: Russ Cox <rsc@swtch.com>
       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(-)
       ---
 (DIR) 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
 (DIR) 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/'`
 (DIR) 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" ;;
 (DIR) 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"
                ;;
 (DIR) 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");
 (DIR) 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
 (DIR) 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
 (DIR) 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
 (DIR) 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 */
 (DIR) 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];
 (DIR) 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