Here is a patch which mostly enables compilation on Mac OS X. The support is not full as there is still some makefiles issues on which I can't find a *clean* correction and a new issue I discovered in this cvs version related to the libwine_port and the getopt function.
Sorry for the -u option, I thought it was enabled by default :(
ChangeLog: * configure.ac configure Add Mac OS X Support, including Mach-O. Fix PowerPC recognition
* Make.rules.in: Add the LDDYLIB definition for Mach-O support.
* libs/wine/Makefile.in, libs/unicode/Makefile.in: Add Mach-O support, add target for .dylib
* dlls/Makedll.rules.in Add an entry for .dylib building
* tools/winebuild/import.c
tools/winebuild/spec32.c
Mac OS X linker does not support the same syntax as linux linker, add a case for darwin
* scheduler/process.c Add support for the environ of darwin.
* scheduler/sysdeps.c include/winnt.h For darwin the TEB should be in r13, fix it.
* loader/module.c Add Mach-O recognition for executable.
* libs/port/interlocked.c
Add r0 preservation in interlocked functions in order lwarx to be effective and change ';' into '\n'.
Pierre d'Herbemont <stegefin@free.fr>
Thanks.
? .DS_Store ? patch.diff.txt ? dlls/.DS_Store ? include/.DS_Store ? libs/port/.DS_Store ? libs/unicode/.DS_Store ? libs/wine/.DS_Store ? loader/.DS_Store ? scheduler/.DS_Store ? tools/.DS_Store ? tools/winebuild/.DS_Store Index: Make.rules.in =================================================================== RCS file: /home/wine/wine/Make.rules.in,v retrieving revision 1.155 diff -u -r1.155 Make.rules.in --- Make.rules.in 21 Apr 2003 23:54:06 -0000 1.155 +++ Make.rules.in 27 Apr 2003 20:04:18 -0000 @@ -34,6 +34,7 @@ DLLEXT = @DLLEXT@ IMPLIBEXT = @IMPLIBEXT@ LDSHARED = @LDSHARED@ +LDDYLIB = @LDDYLIB@ DLLTOOL = @DLLTOOL@ DLLWRAP = @DLLWRAP@ AR = @AR@ rc Index: configure.ac =================================================================== RCS file: /home/wine/wine/configure.ac,v retrieving revision 1.152 diff -u -r1.152 configure.ac --- configure.ac 27 Apr 2003 00:47:59 -0000 1.152 +++ configure.ac 27 Apr 2003 20:05:17 -0000 @@ -777,6 +777,7 @@ AC_SUBST(DLLIBS,"") AC_SUBST(LDDLLFLAGS,"") AC_SUBST(LDSHARED,"") +AC_SUBST(LDDYLIB,"") AC_SUBST(LIBEXT,"so") AC_SUBST(IMPLIBEXT,"def") @@ -792,6 +793,56 @@ fi IMPLIBEXT="a" ;; + darwin*|macosx*) + AC_CHECK_HEADERS(dlfcn.h, + [AC_CHECK_FUNCS(dlopen,, + [AC_CHECK_LIB(dl,dlopen, + [AC_DEFINE(HAVE_DLOPEN,1,[Define if you have dlopen]) + DLLIBS="-ldl"], + [have_dlcompat="no"])])], + [have_dlcompat="no"]) + if test "$have_dlcompat" = "no" + then + echo + echo "*** Error: No dlcompat found," + echo "*** install it in order to build wine on Mac OS X/Darwin" + exit + fi + + AC_CHECK_LIB(poll,poll, + [AC_DEFINE(HAVE_DLPOLL,1,[Define if you have lpoll]) + LIBS="$LIBS -lpoll"], + [have_lpoll="no"]) + + if test "$have_lpoll" = "no" + then + echo + echo "*** Error: No lpoll found," + echo "*** install it in order to build wine on Mac OS X/Darwin" + exit + fi + + AC_CHECK_HEADERS(mach-o/loader.h, + [AC_DEFINE(HAVE_MACHO_LOADER_H,1,[Define if you have mach-o/loader.h])], + [have_macho_loader_h="no"]) + + if test "$have_lpoll" = "no" + then + echo + echo "*** Error: No Macho header found," + echo "*** mach-o/loader.h should be installed with the developer tools" + echo "*** install them in order to build wine on Mac OS X/Darwin" + exit + fi + AC_DEFINE(USE_MACHO,1,[Define if you use mach-o]) + + CFLAGS="-no-cpp-precomp" + LDSHARED="\$(CC) -bundle -flat_namespace -undefined suppress" + LDDLLFLAGS="" + LIBEXT=dylib + AC_SUBST(LDDYLIB,"\$(CC) -dynamiclib -single_module -flat_namespace -undefined suppress") + DLLEXT=".so" + ;; *) AC_CHECK_HEADERS(dlfcn.h, [AC_CHECK_FUNCS(dlopen,, @@ -868,6 +919,8 @@ case $build_os in cygwin*|mingw32*) AC_SUBST(LDPATH,"PATH=\"\$(TOOLSDIR)/libs/unicode:\$\$PATH\"") ;; + darwin*|macosx*) + AC_SUBST(LDPATH,"DYLD_LIBRARY_PATH=\"\$(TOOLSDIR)/library:\$(TOOLSDIR)/unicode:\$\$PATH\"") ;; *) AC_SUBST(LDPATH,"LD_LIBRARY_PATH=\"\$(TOOLSDIR)/libs/unicode:\$\$LD_LIBRARY_PATH\"") ;; esac @@ -1295,10 +1348,17 @@ *i[[3456789]]86*) WINE_CHECK_DEFINE([__i386__]) ;; *alpha*) WINE_CHECK_DEFINE([__ALPHA__]) ;; *sparc*) WINE_CHECK_DEFINE([__sparc__]) ;; +dnl for the powerpc it seems to be two flags, FIXME : they should be unified + *powerpc*) WINE_CHECK_DEFINE([__powerpc__]) + WINE_CHECK_DEFINE([__PPC__]) ;; esac case $host_vendor in *sun*) WINE_CHECK_DEFINE([__sun__]) ;; +esac + +case $host_os in + *darwin*|macosx*) WINE_CHECK_DEFINE([__darwin__]) ;; esac dnl **** Generate output files **** Index: dlls/Makedll.rules.in =================================================================== RCS file: /home/wine/wine/dlls/Makedll.rules.in,v retrieving revision 1.55 diff -u -r1.55 Makedll.rules.in --- dlls/Makedll.rules.in 21 Apr 2003 23:54:06 -0000 1.55 +++ dlls/Makedll.rules.in 27 Apr 2003 20:05:17 -0000 @@ -34,6 +34,10 @@ $(LDCOMBINE) $(ALL_OBJS) -o $@ -$(STRIP) --strip-unneeded $@ +# Rule for .dylib files +$(MODULE).dylib: $(MAINSPEC).o $(ALL_OBJS) Makefile.in + $(LDSHARED) $(LDDLLFLAGS) $(MAINSPEC).o $(ALL_OBJS) -o $@ -L$(DLLDIR) $(LDIMPORTS:%=-l%) $(ALL_LIBS) -lc + # Rule for 16-bit glue $(MODULE).glue.c: $(C_SRCS) $(C_SRCS16) $(WINEBUILD) Index: include/winnt.h =================================================================== RCS file: /home/wine/wine/include/winnt.h,v retrieving revision 1.157 diff -u -r1.157 winnt.h --- include/winnt.h 10 Apr 2003 00:19:25 -0000 1.157 +++ include/winnt.h 27 Apr 2003 20:05:36 -0000 @@ -1632,7 +1632,11 @@ extern inline struct _TEB * WINAPI NtCurrentTeb(void) { struct _TEB *teb; +# ifdef __darwin + __asm__("\tmr %0, r13" : "=r" (teb)); +# else __asm__("\tmr %0, 2" : "=r" (teb)); +# endif return teb; } #else Index: libs/port/interlocked.c =================================================================== RCS file: /home/wine/wine/libs/port/interlocked.c,v retrieving revision 1.1 diff -u -r1.1 interlocked.c --- libs/port/interlocked.c 20 Mar 2003 22:06:16 -0000 1.1 +++ libs/port/interlocked.c 27 Apr 2003 20:05:37 -0000 @@ -107,11 +107,11 @@ long ret = 0; long scratch; __asm__ __volatile__( - "0: lwarx %0,0,%2 ;" + "0: lwarx %0,0,%2 \n" " xor. %1,%4,%0;" - " bne 1f;" - " stwcx. %3,0,%2;" - " bne- 0b;" + " bne 1f\n" + " stwcx. %3,0,%2\n" + " bne- 0b\n" "1: " : "=&r"(ret), "=&r"(scratch) : "r"(dest), "r"(xchg), "r"(compare) @@ -124,15 +124,15 @@ long ret = 0; long scratch; __asm__ __volatile__( - "0: lwarx %0,0,%2 ;" - " xor. %1,%4,%0;" - " bne 1f;" - " stwcx. %3,0,%2;" - " bne- 0b;" + "0: lwarx %0,0,%2 \n" + " xor. %1,%4,%0\n" + " bne 1f\n" + " stwcx. %3,0,%2\n" + " bne- 0b\n" "1: " : "=&r"(ret), "=&r"(scratch) : "r"(dest), "r"(xchg), "r"(compare) - : "cr0","memory"); + : "cr0","memory","r0"); return ret; } @@ -141,13 +141,13 @@ long ret = 0; long zero = 0; __asm__ __volatile__( - "0: lwarx %0, %3, %1;" - " add %0, %2, %0;" - " stwcx. %0, %3, %1;" - " bne- 0b;" + "0: lwarx %0, %3, %1\n" + " add %0, %2, %0\n" + " stwcx. %0, %3, %1\n" + " bne- 0b\n" : "=&r" (ret) : "r"(dest), "r"(incr), "r"(zero) - : "cr0", "memory" + : "cr0", "memory", "r0" ); return ret-incr; } @@ -156,12 +156,12 @@ { long ret = 0; __asm__ __volatile__( - "0: lwarx %0,0,%1 ;" - " stwcx. %2,0,%1;" - " bne- 0b;" + "0: lwarx %0,0,%1 \n" + " stwcx. %2,0,%1\n" + " bne- 0b\n" : "=&r"(ret) : "r"(dest), "r"(val) - : "cr0","memory"); + : "cr0","memory","r0"); return ret; } @@ -169,12 +169,12 @@ { void *ret = NULL; __asm__ __volatile__( - "0: lwarx %0,0,%1 ;" - " stwcx. %2,0,%1;" - " bne- 0b;" + "0: lwarx %0,0,%1 \n" + " stwcx. %2,0,%1 \n" + " bne- 0b \n" : "=&r"(ret) : "r"(dest), "r"(val) - : "cr0","memory"); + : "cr0","memory","r0"); return ret; } Index: libs/unicode/Makefile.in =================================================================== RCS file: /home/wine/wine/libs/unicode/Makefile.in,v retrieving revision 1.3 diff -u -r1.3 Makefile.in --- libs/unicode/Makefile.in 23 Mar 2003 20:11:45 -0000 1.3 +++ libs/unicode/Makefile.in 27 Apr 2003 20:05:37 -0000 @@ -85,6 +85,12 @@ @MAKE_RULES@ +libwine_unicode.$(SOVERSION).dylib: $(OBJS) Makefile.in + $(LDDYLIB) $(OBJS) -o $@ + +libwine_unicode.dylib: libwine_unicode.$(SOVERSION).dylib + $(RM) $@ && $(LN_S) libwine_unicode.$(SOVERSION).dylib $@ + libwine_unicode.so.$(SOVERSION): $(OBJS) Makefile.in $(LDSHARED) $(OBJS) -o $@ @@ -97,7 +103,11 @@ libwine_unicode.dll: $(OBJS) wine_unicode.def Makefile.in $(DLLWRAP) --def $(SRCDIR)/wine_unicode.def -o $@ $(OBJS) -.PHONY: install-lib-so install-lib-dll install-dev-so install-dev-dll +.PHONY: install-lib-dylib install-lib-so install-lib-dll install-dev-so install-dev-dll + +install-lib-dylib: libwine_unicode.$(SOVERSION).dylib dummy + $(MKINSTALLDIRS) $(libdir) + $(INSTALL_PROGRAM) libwine_unicode.$(SOVERSION).dylib $(libdir)/libwine_unicode.$(SOVERSION).dylib install-lib-so: libwine_unicode.so.$(SOVERSION) dummy $(MKINSTALLDIRS) $(libdir) @@ -107,6 +117,10 @@ $(MKINSTALLDIRS) $(libdir) $(INSTALL_DATA) libwine_unicode.dll $(libdir)/libwine_unicode.dll +install-dev-dylib: dummy + $(MKINSTALLDIRS) $(libdir) + cd $(libdir) && $(RM) libwine_unicode.dylib && $(LN_S) libwine_unicode.$(SOVERSION).dylib libwine_unicode.dylib + install-dev-so: dummy $(MKINSTALLDIRS) $(libdir) cd $(libdir) && $(RM) libwine_unicode.so && $(LN_S) libwine_unicode.so.$(SOVERSION) libwine_unicode.so @@ -119,9 +133,9 @@ install install-dev:: $(LIBEXT:%=install-dev-%) uninstall:: - $(RM) $(libdir)/libwine_unicode.a $(libdir)/libwine_unicode.dll $(libdir)/libwine_unicode.so $(libdir)/libwine_unicode.so.$(SOVERSION) + $(RM) $(libdir)/libwine_unicode.a $(libdir)/libwine_unicode.dll $(libdir)/libwine_unicode.so $(libdir)/libwine_unicode.so.$(SOVERSION) $(libdir)/libwine_unicode.dylib $(libdir)/libwine_unicode.$(SOVERSION).dylib clean:: - $(RM) libwine_unicode.so.$(SOVERSION) libwine_unicode.dll + $(RM) libwine_unicode.so.$(SOVERSION) libwine_unicode.dll libwine_unicode.$(SOVERSION).dylib ### Dependencies: Index: libs/wine/Makefile.in =================================================================== RCS file: /home/wine/wine/libs/wine/Makefile.in,v retrieving revision 1.2 diff -u -r1.2 Makefile.in --- libs/wine/Makefile.in 23 Mar 2003 00:28:53 -0000 1.2 +++ libs/wine/Makefile.in 27 Apr 2003 20:05:38 -0000 @@ -20,6 +20,12 @@ @MAKE_RULES@ +libwine.$(SOVERSION).dylib: $(OBJS) + $(LDDYLIB) $(OBJS) $(EXTRALIBS) $(LIBS) -o $@ + +libwine.dylib: libwine.$(SOVERSION).dylib + $(RM) $@ && $(LN_S) libwine.$(SOVERSION).dylib $@ + libwine.so.$(SOVERSION): $(OBJS) Makefile.in $(LDSHARED) $(OBJS) $(EXTRALIBS) $(LIBS) -o $@ @@ -32,7 +38,11 @@ libwine.dll: $(OBJS) wine.def Makefile.in $(DLLWRAP) --def $(SRCDIR)/wine.def -o $@ $(OBJS) $(EXTRALIBS) -.PHONY: install-lib-so install-lib-dll install-dev-so install-dev-dll +.PHONY: install-lib-dylib install-lib-so install-lib-dll install-dev-so install-dev-dll + +install-lib-dylib: libwine.$(SOVERSION).dylib dummy + $(MKINSTALLDIRS) $(libdir) + $(INSTALL_PROGRAM) libwine.$(SOVERSION).dylib $(libdir)/libwine.$(SOVERSION).dylib install-lib-so: libwine.so.$(SOVERSION) dummy $(MKINSTALLDIRS) $(libdir) @@ -42,6 +52,10 @@ $(MKINSTALLDIRS) $(libdir) $(INSTALL_DATA) libwine.dll $(libdir)/libwine.dll +install-dev-dylib: dummy + $(MKINSTALLDIRS) $(libdir) + cd $(libdir) && $(RM) libwine.dylib && $(LN_S) libwine.$(SOVERSION).dylib libwine.dylib + install-dev-so: dummy $(MKINSTALLDIRS) $(libdir) cd $(libdir) && $(RM) libwine.so && $(LN_S) libwine.so.$(SOVERSION) libwine.so @@ -54,9 +68,9 @@ install install-dev:: $(LIBEXT:%=install-dev-%) uninstall:: - $(RM) $(libdir)/libwine.a $(libdir)/libwine.dll $(libdir)/libwine.so $(libdir)/libwine.so.$(SOVERSION) + $(RM) $(libdir)/libwine.a $(libdir)/libwine.dll $(libdir)/libwine.so $(libdir)/libwine.so.$(SOVERSION) $(libdir)/libwine.dylib $(libdir)/libwine.$(SOVERSION).dylib clean:: - $(RM) libwine.so.$(SOVERSION) libwine.dll + $(RM) libwine.so.$(SOVERSION) libwine.dll libwine.$(SOVERSION).dylib ### Dependencies: Index: loader/module.c =================================================================== RCS file: /home/wine/wine/loader/module.c,v retrieving revision 1.182 diff -u -r1.182 module.c --- loader/module.c 5 Apr 2003 05:13:33 -0000 1.182 +++ loader/module.c 27 Apr 2003 20:05:42 -0000 @@ -30,6 +30,9 @@ #ifdef HAVE_UNISTD_H # include <unistd.h> #endif +#ifdef HAVE_MACHO_LOADER_H_ +# include <mach-o/loader.h> +#endif #include "wine/winbase16.h" #include "winerror.h" #include "winternl.h" @@ -255,6 +258,18 @@ unsigned char ignored[12]; unsigned short type; } elf; +#ifdef USE_MACHO + struct + { + unsigned long magic; + unsigned long cputype; + unsigned long cpusubtype; + unsigned long filetype; + unsigned long ncmds; + unsigned long sizeofcmds; + unsigned long flags; + } macho; +#endif /* USE_MACHO */ IMAGE_DOS_HEADER mz; } header; @@ -277,6 +292,30 @@ } return BINARY_UNKNOWN; } + +#ifdef USE_MACHO + /* Mach-o File with Endian set to Big Endian */ + if (header.macho.magic == 0xfeedface) + { + /* FIXME: we don't bother to check byte order, architecture, etc. */ + switch(header.macho.filetype) + { + case MH_BUNDLE: return BINARY_UNIX_LIB; + } + return BINARY_UNKNOWN; + } + + /* Mach-o File with Endian set to Little Endian */ + if (header.macho.magic == 0xecafdeef) + { + /* FIXME: we don't bother to check byte order, architecture, etc. */ + switch(header.macho.filetype) + { + case MH_BUNDLE: return BINARY_UNIX_LIB; + } + return BINARY_UNKNOWN; + } +#endif /* USE_MACHO */ /* Not ELF, try DOS */ Index: scheduler/process.c =================================================================== RCS file: /home/wine/wine/scheduler/process.c,v retrieving revision 1.213 diff -u -r1.213 process.c --- scheduler/process.c 27 Apr 2003 00:47:58 -0000 1.213 +++ scheduler/process.c 27 Apr 2003 20:05:52 -0000 @@ -32,6 +32,11 @@ #ifdef HAVE_UNISTD_H # include <unistd.h> #endif +#ifdef __darwin__ +# include <crt_externs.h> +# define environ (*_NSGetEnviron()) +#endif + #include "wine/winbase16.h" #include "wine/winuser16.h" #include "wine/exception.h" Index: scheduler/sysdeps.c =================================================================== RCS file: /home/wine/wine/scheduler/sysdeps.c,v retrieving revision 1.65 diff -u -r1.65 sysdeps.c --- scheduler/sysdeps.c 13 Apr 2003 01:04:25 -0000 1.65 +++ scheduler/sysdeps.c 27 Apr 2003 20:05:53 -0000 @@ -89,7 +89,11 @@ wine_ldt_init_fs( teb->teb_sel, &fs_entry ); #elif defined(__powerpc__) /* On PowerPC, the current TEB is in the gpr13 register */ +# ifdef __darwin__ + __asm__ __volatile__("mr r13, %0" : : "r" (teb)); +# else /* __darwin__ */ __asm__ __volatile__("mr 2, %0" : : "r" (teb)); +# endif #elif defined(HAVE__LWP_CREATE) /* On non-i386 Solaris, we use the LWP private pointer */ _lwp_setprivate( teb ); @@ -465,7 +469,11 @@ return (struct _TEB *)_lwp_getprivate(); } #elif defined(__powerpc__) +# ifdef __darwin__ +__ASM_GLOBAL_FUNC( NtCurrentTeb, "\n\tmr r3,r13\n\tblr" ); +# else __ASM_GLOBAL_FUNC( NtCurrentTeb, "\n\tmr 3,2\n\tblr" ); +# endif #else # error NtCurrentTeb not defined for this architecture #endif /* __i386__ */ Index: tools/winebuild/import.c =================================================================== RCS file: /home/wine/wine/tools/winebuild/import.c,v retrieving revision 1.49 diff -u -r1.49 import.c --- tools/winebuild/import.c 10 Apr 2003 18:36:40 -0000 1.49 +++ tools/winebuild/import.c 27 Apr 2003 20:05:59 -0000 @@ -819,6 +819,28 @@ } #elif defined(__PPC__) +/* Darwin's ld doesn't like the same asm code as linux linker... */ +# ifdef __darwin___ + fprintf(outfile, "\taddi r1, r1, -0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tstw r9, 0(r1)\\n\"\n"); + fprintf(outfile, "\t\"\\taddi r1, r1, -0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tstw r8, 0(r1)\\n\"\n"); + fprintf(outfile, "\t\"\\taddi r1, r1, -0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tstw r7, 0(r1)\\n\"\n"); + + fprintf(outfile, "\t\"\\tlis r9,ha16(_imports+%d)\\n\"\n", pos); + fprintf(outfile, "\t\"\\tla r8,lo16(_imports+%d)(r9)\\n\"\n", pos); + fprintf(outfile, "\t\"\\tlwz r7, 0(r8)\\n\"\n"); + fprintf(outfile, "\t\"\\tmtctr r7\\n\"\n"); + + fprintf(outfile, "\t\"\\tlwz r7, 0(r1)\\n\"\n"); + fprintf(outfile, "\t\"\\taddi r1, r1, 0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tlwz r8, 0(r1)\\n\"\n"); + fprintf(outfile, "\t\"\\taddi r1, r1, 0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tlwz r9, 0(r1)\\n\"\n"); + fprintf(outfile, "\t\"\\taddi r1, r1, 0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tbctr\\n"); +# else /* __darwin___ */ fprintf(outfile, "\taddi 1, 1, -0x4\\n\"\n"); fprintf(outfile, "\t\"\\tstw 9, 0(1)\\n\"\n"); fprintf(outfile, "\t\"\\taddi 1, 1, -0x4\\n\"\n"); @@ -838,6 +860,7 @@ fprintf(outfile, "\t\"\\tlwz 9, 0(1)\\n\"\n"); fprintf(outfile, "\t\"\\taddi 1, 1, 0x4\\n\"\n"); fprintf(outfile, "\t\"\\tbctr\\n"); +# endif /* __darwin___ */ #else #error You need to define import thunks for your architecture! #endif @@ -845,7 +868,13 @@ } pos += 4; } + +/* darwin and Mach-o have a different behavior */ +#ifdef __darwin__ + fprintf( outfile, "\".text\");\n#ifndef __GNUC__\n}\n#endif\n\n" ); +#else fprintf( outfile, "\".section\\t\\\".text\\\"\");\n#ifndef __GNUC__\n}\n#endif\n\n" ); +#endif /* __darwin__ */ done: return nb_imm; @@ -968,6 +997,11 @@ fprintf( outfile, "#ifndef __GNUC__\n" ); fprintf( outfile, "static void __asm__dummy_delay_import(void) {\n" ); fprintf( outfile, "#endif\n" ); + +#ifdef __darwin__ + /* darwin likes this one */ + fprintf( outfile, "\"\\t.data\\n\"" ); +#endif fprintf( outfile, "asm(\".align %d\\n\"\n", get_alignment(8) ); fprintf( outfile, " \"\\t" __ASM_FUNC("__wine_delay_load_asm") "\\n\"\n" ); @@ -982,6 +1016,53 @@ fprintf( outfile, " \"\\tmov %%g1, %%o0\\n\"\n" ); fprintf( outfile, " \"\\tjmp %%o0\\n\\trestore\\n\"\n" ); #elif defined(__PPC__) +# ifdef __darwin__ + /* Save all callee saved registers into a stackframe. */ + fprintf( outfile, " \"\\tstwu r1, -48(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tstw Êr3, 4(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tstw Êr4, 8(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tstw Êr5, 12(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tstw Êr6, 16(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tstw Êr7, 20(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tstw Êr8, 24(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tstw Êr9, 28(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tstw Êr10, 32(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tstw Êr11, 36(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tstw Êr12, 40(r1)\\n\"\n" ); + + /* r0 -> r3 (arg1) */ + fprintf( outfile, " \"\\tmr Êr3, r0\\n\"\n" ); + + /* save return address */ + fprintf( outfile, " \"\\tmflr Êr0\\n\"\n" ); + fprintf( outfile, " \"\\tstw Êr0, 44(r1)\\n\"\n" ); + + /* Call the __wine_delay_load function, arg1 is arg1. */ + fprintf( outfile, " \"\\tbl __wine_delay_load\\n\"\n" ); + + /* Load return value from call into ctr register */ + fprintf( outfile, " \"\\tmtctr r3\\n\"\n" ); + + /* restore all saved registers and drop stackframe. */ + fprintf( outfile, " \"\\tlwz Êr3, 4(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tlwz Êr4, 8(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tlwz Êr5, 12(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tlwz Êr6, 16(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tlwz Êr7, 20(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tlwz Êr8, 24(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tlwz Êr9, 28(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tlwz Êr10, 32(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tlwz Êr11, 36(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tlwz Êr12, 40(r1)\\n\"\n" ); + + /* Load return value from call into return register */ + fprintf( outfile, " \"\\tlwz Êr0, 44(r1)\\n\"\n" ); + fprintf( outfile, " \"\\tmtlr r0\\n\"\n" ); + fprintf( outfile, " \"\\taddi r1, r1, 48\\n\"\n" ); + + /* branch to ctr register. */ + fprintf( outfile, " \"\\tbctr\\n\"\n" ); +# else /* __darwin__ */ /* Save all callee saved registers into a stackframe. */ fprintf( outfile, " \"\\tstwu %%r1, -48(%%r1)\\n\"\n" ); fprintf( outfile, " \"\\tstw %%r3, 4(%%r1)\\n\"\n" ); @@ -1025,7 +1106,7 @@ fprintf( outfile, " \"\\taddi %%r1, %%r1, 48\\n\"\n" ); /* branch to ctr register. */ fprintf( outfile, " \"\\tbctr\\n\"\n" ); - +# endif /* __darwin__ */ #else #error You need to defined delayed import thunks for your architecture! #endif @@ -1092,6 +1173,28 @@ } #elif defined(__PPC__) +# ifdef __darwin__ + fprintf(outfile, "\t\"addi 1, 1, -0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tstw 9, 0(1)\\n\"\n"); + fprintf(outfile, "\t\"\\taddi 1, 1, -0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tstw 8, 0(1)\\n\"\n"); + fprintf(outfile, "\t\"\\taddi 1, 1, -0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tstw 7, 0(1)\\n\"\n"); + + fprintf(outfile, "\t\"\\tlis 9,ha16(_delay_imports+%d)\\n\"\n", pos); + fprintf(outfile, "\t\"\\tla 8,lo16(_delay_imports+%d)(9)\\n\"\n", pos); + fprintf(outfile, "\t\"\\tlwz 7, 0(8)\\n\"\n"); + fprintf(outfile, "\t\"\\tmtctr 7\\n\"\n"); + + fprintf(outfile, "\t\"\\tlwz 7, 0(1)\\n\"\n"); + fprintf(outfile, "\t\"\\taddi 1, 1, 0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tlwz 8, 0(1)\\n\"\n"); + fprintf(outfile, "\t\"\\taddi 1, 1, 0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tlwz 9, 0(1)\\n\"\n"); + + fprintf(outfile, "\t\"\\taddi 1, 1, 0x4\\n\"\n"); + fprintf(outfile, "\t\"\\tbctr\\n\""); +# else /* __darwine__*/ fprintf(outfile, "\t\"addi 1, 1, -0x4\\n\"\n"); fprintf(outfile, "\t\"\\tstw 9, 0(1)\\n\"\n"); fprintf(outfile, "\t\"\\taddi 1, 1, -0x4\\n\"\n"); @@ -1116,12 +1219,20 @@ fprintf(outfile, "\t\"lwz r0, %d(r0)\\n\\t\"\n", pos); fprintf(outfile, "\t\"mtctr r0\\n\\t\"\n"); fprintf(outfile, "\t\"bctr\\n\"");*/ +# endif /* __darwin__ */ #else #error You need to define delayed import thunks for your architecture! #endif fprintf( outfile, "\n" ); } } + +#ifdef __darwin__ + fprintf( outfile, "\".text\");\n" ); +#else /* __darwin__ */ + fprintf( outfile, "\".section \\\".text\\\"\");\n" ); +#endif /* __darwin__ */ + fprintf( outfile, "\".section \\\".text\\\"\");\n" ); fprintf( outfile, "#ifndef __GNUC__\n" ); fprintf( outfile, "}\n" ); Index: tools/winebuild/spec32.c =================================================================== RCS file: /home/wine/wine/tools/winebuild/spec32.c,v retrieving revision 1.65 diff -u -r1.65 spec32.c --- tools/winebuild/spec32.c 3 Apr 2003 18:05:17 -0000 1.65 +++ tools/winebuild/spec32.c 27 Apr 2003 20:06:03 -0000 @@ -429,6 +429,20 @@ fprintf( outfile, " \"\\t.section\\t\\\".text\\\"\\n\");\n" ); } #elif defined(__PPC__) +# ifdef __darwin__ + if (constructor) + { + fprintf( outfile, "asm(\"\\t.section .init,ax\\n\"\n" ); + fprintf( outfile, " \"\\tbl " __ASM_NAME("%s") "\\n\"\n", constructor ); + fprintf( outfile, " \"\\t.text\\n\");\n" ); + } + if (destructor) + { + fprintf( outfile, "asm(\"\\t.section .fini,ax\\n\"\n" ); + fprintf( outfile, " \"\\tbl " __ASM_NAME("%s") "\\n\"\n", destructor ); + fprintf( outfile, " \"\\t.text\\n\");\n" ); + } +# else /* __darwin__ */ if (constructor) { fprintf( outfile, "asm(\"\\t.section\\t\\\".init\\\" ,\\\"ax\\\"\\n\"\n" ); @@ -441,6 +455,7 @@ fprintf( outfile, " \"\\tbl " __ASM_NAME("%s") "\\n\"\n", destructor ); fprintf( outfile, " \"\\t.section\\t\\\".text\\\"\\n\");\n" ); } +# endif /* __darwin__ */ #else #error You need to define the DLL constructor for your architecture #endif @@ -489,7 +504,11 @@ fprintf( outfile, "#ifndef __GNUC__\n" ); fprintf( outfile, "static void __asm__dummy_header(void) {\n" ); fprintf( outfile, "#endif\n" ); +#ifdef __darwin__ + fprintf( outfile, "asm(\".text\\n\\t\"\n" ); +#else fprintf( outfile, "asm(\".section \\\".text\\\"\\n\\t\"\n" ); +#endif fprintf( outfile, " \".align %d\\n\"\n", get_alignment(page_size) ); fprintf( outfile, " \"" __ASM_NAME("pe_header") ":\\t.skip 65536\\n\\t\");\n" ); fprintf( outfile, "#ifndef __GNUC__\n" ); @@ -546,7 +565,11 @@ else { fprintf( outfile, "#ifdef __GNUC__\n" ); + fprintf( outfile, "# ifdef __darwin__\n" ); + fprintf( outfile, "extern void DllMain() __attribute__((weak_import));\n" ); + fprintf( outfile, "# else\n" ); fprintf( outfile, "extern void DllMain() __attribute__((weak));\n" ); + fprintf( outfile, "# endif\n" ); fprintf( outfile, "#else\n" ); fprintf( outfile, "extern void DllMain();\n" ); fprintf( outfile, "static void __asm__dummy_dllmain(void)" ); @@ -920,7 +943,11 @@ fprintf( outfile, " \"\\tbl " __ASM_NAME("__wine_dbg_%s_init") "\\n\"\n", prefix ); fprintf( outfile, " \"\\t.section\\t\\\".fini\\\" ,\\\"ax\\\"\\n\"\n" ); fprintf( outfile, " \"\\tbl " __ASM_NAME("__wine_dbg_%s_fini") "\\n\"\n", prefix ); +# ifdef __darwin__ + fprintf( outfile, " \"\\t.text\\n\");\n" ); +# else fprintf( outfile, " \"\\t.section\\t\\\".text\\\"\\n\");\n" ); +# endif #else #error You need to define the DLL constructor for your architecture #endif