Hello,
We've done couple of changes in wine in order to compile with gcc-3.3.1 using binutils-2.14 and run on solaris --- mercy% uname -a SunOS mercy 5.8 Generic_108528-19 sun4u sparc SUNW,Sun-Blade-1000 --- I'm not posting this patch to wine-patch yet, since there are couple of things I'm not sure are solved in "correct" way. Diff file made on 2003-10-06 06:13 EST is attached. I've configured wine this way: "./configure --without-opengl CFLAGS="-g3 -O0""
Here go my questions regarding to this files: * dlls/x11drv/xvidmode.c I've been just ifdeffing out anything I couldn't compile because of missing LIBXXF86VM. Maybe original author of the code knows what *exactly* should be ifdeffed out.
* libs/wine/port.c Hm, good old wine_switch_to_stack() I've been changing aproximately one year ago was changed a lot from that time. Anyways current change I've done in this file prevents crash caused by instruction "0xfed9d100 <start_process+16>: st %i0, [%fp +0x44]" (unused function argument arg resolves to %fp+0x44 address... (why? it's not used in that function, maybe -g3 -O0 flags?)). Substracting 96 bytes from original stack "emulates" ommited save instruction in wine_switch_to_stack() and ensures, that store instruction doesn't crash. Well, I guess original wine_switch_to_stack() code could work with older versions of gcc (very probably with gcc-3.2)...
* programs/Makefile.in Just removed winegdb from building - we still don't have sparc register map (and related) defined.
* tools/bin2res.c include <limits.h> ensures PATH_MAX used later is defined.
* tools/winebuild/import.c This is another hack needed because of gcc-3.3.1 I guess. I don't know if this would work also on x86 platform, but on solaris fixes gas's "Error: operation combines symbols in different segments". Gcc-3.3.1 compiles imports and delayed_imports into the different sections (.data.rel.local, .data.rel), thus gas threw the error mentioned above.
* windows/winproc.c Finally, allignment problem on sparc platform - I've just ifdeffed out packing includes, so structs are alligned to (default) 4 byte boundary.
I'd appreciate any comments - especially those related to gcc-3.3.1.
Regards ;-), Juraj
? output.txt ? wine-solaris-20031006.diff ? dlls/comctl32/a.out ? dlls/comctl32/comctl32.spec.s ? dlls/ddraw/a.out ? dlls/ddraw/ddraw.spec.s ? tools/makedep.o.aBaiw5 ? tools/winebuild.tar.gz ? tools/winebuild/ddraw.spec.s ? tools/winebuild/out.txt ? windows/winproc.ii Index: dlls/iphlpapi/ifenum.c =================================================================== RCS file: /home/wine/wine/dlls/iphlpapi/ifenum.c,v retrieving revision 1.6 diff -u -r1.6 ifenum.c --- dlls/iphlpapi/ifenum.c 5 Sep 2003 23:08:37 -0000 1.6 +++ dlls/iphlpapi/ifenum.c 6 Oct 2003 10:13:07 -0000 @@ -785,14 +785,27 @@
fd = socket(PF_INET, SOCK_DGRAM, 0); if (fd != -1) { +#if defined(__sparc__) + struct lifreq ifr; +#else struct ifreq ifr; +#endif
+#if defined(__sparc__) + strncpy(ifr.lifr_name, name, IFNAMSIZ); + ifr.lifr_name[IFNAMSIZ-1] = '\0'; +#else strncpy(ifr.ifr_name, name, IFNAMSIZ); ifr.ifr_name[IFNAMSIZ-1] = '\0'; +#endif if ((ioctl(fd, SIOCGIFMTU, &ifr))) ret = ERROR_INVALID_DATA; else { +#if defined(__sparc__) + *mtu = ifr.lifr_mtu; +#else *mtu = ifr.ifr_mtu; +#endif ret = NO_ERROR; } } Index: dlls/x11drv/xvidmode.c =================================================================== RCS file: /home/wine/wine/dlls/x11drv/xvidmode.c,v retrieving revision 1.23 diff -u -r1.23 xvidmode.c --- dlls/x11drv/xvidmode.c 30 Sep 2003 00:31:42 -0000 1.23 +++ dlls/x11drv/xvidmode.c 6 Oct 2003 10:13:07 -0000 @@ -101,7 +101,7 @@ return 1; }
-static Bool in_desktop_mode; +static Bool in_desktop_mode = 0; static const unsigned int depths[] = {8, 16, 32};
void X11DRV_XF86VM_Init(void) @@ -454,6 +454,7 @@ #endif }
+#ifdef HAVE_LIBXXF86VM /* implementation of EnumDisplaySettings for XF86VM */ BOOL X11DRV_XF86VM_EnumDisplaySettingsExW( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags) { @@ -492,6 +493,7 @@ TRACE("mode %ld -- not present\n", n); return FALSE; } +#endif
/* implementation of ChangeDisplaySettings for XF86VM */ LONG X11DRV_XF86VM_ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode, @@ -612,17 +614,20 @@ */ BOOL X11DRV_EnumDisplaySettingsExW( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags) { +#ifdef HAVE_LIBXXF86VM if (dd_modes) { /* XVidMode */ return X11DRV_XF86VM_EnumDisplaySettingsExW(name, n, devmode, flags); } - else if (in_desktop_mode) + else + if (in_desktop_mode) { /* desktop */ return X11DRV_desktop_EnumDisplaySettingsExW(name, n, devmode, flags); } else +#endif { /* no resolution changing */ return X11DRV_nores_EnumDisplaySettingsExW(name, n, devmode, flags); @@ -674,6 +679,7 @@ { TRACE("Return to original display mode\n"); } +#ifdef HAVE_LIBXXF86VM if (dd_modes) { /* XVidMode */ @@ -687,6 +693,7 @@ hwnd, flags, lpvoid ); } else +#endif { /* no resolution changing */ return X11DRV_nores_ChangeDisplaySettingsExW( devname, devmode, Index: libs/wine/port.c =================================================================== RCS file: /home/wine/wine/libs/wine/port.c,v retrieving revision 1.1 diff -u -r1.1 port.c --- libs/wine/port.c 29 Aug 2003 22:23:42 -0000 1.1 +++ libs/wine/port.c 6 Oct 2003 10:13:07 -0000 @@ -69,7 +69,7 @@ __ASM_GLOBAL_FUNC( wine_switch_to_stack, "mov %o0, %l0\n\t" /* store first argument */ "mov %o1, %l1\n\t" /* store second argument */ - "mov %o2, %sp\n\t" /* store stack */ + "sub %o2, 96, %sp\n\t" /* store stack */ "call %l0, 0\n\t" /* call func */ "mov %l1, %o0\n\t" /* delay slot: arg for func */ "ta 0x01"); /* breakpoint - we never get here */ Index: programs/Makefile.in =================================================================== RCS file: /home/wine/wine/programs/Makefile.in,v retrieving revision 1.39 diff -u -r1.39 Makefile.in --- programs/Makefile.in 23 Jun 2003 19:51:21 -0000 1.39 +++ programs/Makefile.in 6 Oct 2003 10:13:07 -0000 @@ -26,7 +26,6 @@ wineboot \ winecfg \ wineconsole \ - winedbg \ winefile \ winemenubuilder \ winemine \ @@ -53,7 +52,6 @@ wineboot \ winecfg \ wineconsole \ - winedbg \ winefile \ winemenubuilder \ winemine \ @@ -74,7 +72,6 @@ wineboot \ winecfg \ wineconsole \ - winedbg \ winefile \ winemine \ winepath \ @@ -85,7 +82,6 @@ rpcss.exe \ wcmd.exe \ wineconsole.exe \ - winedbg.exe \ winemenubuilder.exe \ winevdm.exe \ winhelp.exe Index: tools/bin2res.c =================================================================== RCS file: /home/wine/wine/tools/bin2res.c,v retrieving revision 1.18 diff -u -r1.18 bin2res.c --- tools/bin2res.c 3 Oct 2003 03:34:10 -0000 1.18 +++ tools/bin2res.c 6 Oct 2003 10:13:07 -0000 @@ -24,6 +24,7 @@ #include "wine/port.h"
#include <stdio.h> +#include <limits.h> #include <stdlib.h> #include <ctype.h> #include <string.h> Index: tools/winebuild/import.c =================================================================== RCS file: /home/wine/wine/tools/winebuild/import.c,v retrieving revision 1.52 diff -u -r1.52 import.c --- tools/winebuild/import.c 13 Aug 2003 21:57:42 -0000 1.52 +++ tools/winebuild/import.c 6 Oct 2003 10:13:07 -0000 @@ -806,7 +806,7 @@
fprintf( outfile, "#ifndef __GNUC__\nstatic void __asm__dummy_import(void) {\n#endif\n\n" ); pos = 20 * (nb_imm + 1); /* offset of imports.data from start of imports */ - fprintf( outfile, "asm(".data\n\t.align %d\n"\n", get_alignment(8) ); + fprintf( outfile, "asm(".section\t\".data.rel.local\"\n\t.align %d\n"\n", get_alignment(8) ); for (i = 0; i < nb_imports; i++) { if (dll_imports[i]->delay) continue; @@ -1082,7 +1082,7 @@ idx++; }
- fprintf( outfile, "\n ".data\n\t.align %d\n"\n", get_alignment(8) ); + fprintf( outfile, "\n ".section\t\".data.rel\"\n\t.align %d\n"\n", get_alignment(8) ); pos = nb_delayed * 32; for (i = 0; i < nb_imports; i++) { Index: windows/winproc.c =================================================================== RCS file: /home/wine/wine/windows/winproc.c,v retrieving revision 1.108 diff -u -r1.108 winproc.c --- windows/winproc.c 5 Sep 2003 23:15:39 -0000 1.108 +++ windows/winproc.c 6 Oct 2003 10:13:07 -0000 @@ -47,7 +47,9 @@ WINE_DECLARE_DEBUG_CHANNEL(relay); WINE_DEFAULT_DEBUG_CHANNEL(win);
-#include "pshpack1.h" +#if !defined(__sparc__) +# include "pshpack1.h" +#endif
/* Window procedure 16-to-32-bit thunk */ typedef struct @@ -78,7 +80,10 @@ BYTE jmp; /* jmp proc (relative jump) */ WNDPROC proc; } WINPROC_JUMP; -#include "poppack.h" + +#if !defined(__sparc__) +# include "poppack.h" +#endif
typedef union {