Date: Sat, 03 Nov 2012 14:47:54 -0700 From: Jan Beich <jbeich@tormail.org> To: David Naylor <naylor.b.david@gmail.com> Cc: David Chisnall <theraven@freebsd.org>, freebsd-current@freebsd.org, Brooks Davis <brooks@freebsd.org> Subject: Re: November 5th is Clang-Day Message-ID: <1TUlad-0008bB-OF@internal.tormail.org> In-Reply-To: <201211030948.43530.naylor.b.david@gmail.com> (David Naylor's message of "Sat, 3 Nov 2012 09:48:40 %2B0200") References: <20121102032945.GF65074@lor.one-eyed-alien.net> <1TU9lE-000KmO-Cc@internal.tormail.org> <F576E5E7-AA21-4E37-8872-7BC89D8AF73F@FreeBSD.org> <201211030948.43530.naylor.b.david@gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--=-=-= Content-Type: text/plain David Naylor <naylor.b.david@gmail.com> writes: > On Friday, 2 November 2012 10:13:30 David Chisnall wrote: > >> On 2 Nov 2012, at 05:24, Jan Beich wrote: >> >> Known Issues >> > >> > emulators/wine doesn't work with lib32 built by clang, probably due to >> > wine bugs. >> >> Is this still the case? There was an issue preventing WINE from working >> because it required stricter stack alignment than clang provided by >> default, but I thought it was fixed. Does WINE work if compiled with the >> flag that forces stack realignment? If not, then it's some other issue... > > There are two issues here: 1) wine compiled with clang, and 2) wine (compiled > with gcc) running on clang compiled base. > > Regarding 1), according to the wiki [1], wine does have stack alignment issues > and some wine programs do not run when compiled with clang [2][3] and other > bugs with clang cause freezing within wine [4][5]. The impression I get is > that, using the work-a-round of stack realignment, wine does work to some > extent when compiled by clang. Took me some time but now I can confirm that clang-built wine-1.5.16 works fine for me with gcc-built lib32 (i.e. ld-elf32.so.1 + /usr/lib32). > Regarding 2) (which I believe Jan was referring to), when I have a gcc built > world and just replace lib32 with clang built libraries I have winecfg and > regedit launching but displaying black screens. Switching back to gcc built > lib32 I get a working winecfg and regedit. This, to me, indicates a clang > error somewhere. My experience varies between clang-built and gcc-built wine. # clang, quick crash $ winecfg err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x622975ab err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x622975ab err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x622975ab Exit 5 # gcc, black rectangle $ winecfg err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x622995ab err:service:service_send_start_message service L"MountMgr" failed to start fixme:service:scmdatabase_autostart_services Auto-start service L"MountMgr" failed to start: 1053 err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x622995ab err:service:service_send_start_message service L"PlugPlay" failed to start fixme:service:scmdatabase_autostart_services Auto-start service L"PlugPlay" failed to start: 1053 err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x622995ab err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x622995ab load: 0.89 cmd: wine 14626 [piperd] 7.49r 0.03u 0.01s 0% 8932k So, why not switch stack alignment in wine (upstream)? This would make /stable/9 wine package continue to work on /head. Here's my wine package built with and without the patch. # sha256: cef5e543a5c534acb7237634224561863122ab3c256df319c6428856266d79fd http://ompldr.org/vZzR0bw/4byte-clang-wine-fbsd64-1.5.16,1.txz # sha256: 68e402bf7cb39ea48b9bef7772422cf476e89b214fd3b98ced37e0068f588c6c http://ompldr.org/vZzR0ZA/16byte-clang-wine-fbsd64-1.5.16,1.txz --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=patch-16byte-stackalign # include, winegcc: Switch to 16-byte aligned stack on FreeBSD. # # We cannot use __clang__ or __FreeBSD_version in order to stay # compatible where a package built for FreeBSD X also works on # FreeBSD X+1. --- include/windef.h~ +++ include/windef.h @@ -53,7 +53,8 @@ extern "C" { #ifndef __stdcall # ifdef __i386__ # ifdef __GNUC__ -# ifdef __APPLE__ /* Mac OS X uses a 16-byte aligned stack and not a 4-byte one */ +/* Mac OS X and FreeBSD 10 use a 16-byte aligned stack and not a 4-byte one */ +# if defined(__APPLE__) || defined(__FreeBSD__) # define __stdcall __attribute__((__stdcall__)) __attribute__((__force_align_arg_pointer__)) # else # define __stdcall __attribute__((__stdcall__)) --- include/msvcrt/crtdefs.h~ +++ include/msvcrt/crtdefs.h @@ -44,7 +44,8 @@ #ifndef __stdcall # ifdef __i386__ # ifdef __GNUC__ -# ifdef __APPLE__ /* Mac OS X uses a 16-byte aligned stack and not a 4-byte one */ +/* Mac OS X and FreeBSD 10 use a 16-byte aligned stack and not a 4-byte one */ +# if defined(__APPLE__) || defined(__FreeBSD__) # define __stdcall __attribute__((__stdcall__)) __attribute__((__force_align_arg_pointer__)) # else # define __stdcall __attribute__((__stdcall__)) --- tools/winegcc/utils.h~ +++ tools/winegcc/utils.h @@ -42,7 +42,7 @@ enum target_cpu enum target_platform { - PLATFORM_UNSPECIFIED, PLATFORM_APPLE, PLATFORM_SOLARIS, PLATFORM_WINDOWS, PLATFORM_CYGWIN + PLATFORM_UNSPECIFIED, PLATFORM_APPLE, PLATFORM_FREEBSD, PLATFORM_SOLARIS, PLATFORM_WINDOWS, PLATFORM_CYGWIN }; void error(const char* s, ...) DECLSPEC_NORETURN; --- tools/winegcc/winegcc.c~ +++ tools/winegcc/winegcc.c @@ -171,6 +171,7 @@ static const struct { { "macos", PLATFORM_APPLE }, { "darwin", PLATFORM_APPLE }, + { "freebsd", PLATFORM_FREEBSD }, { "solaris", PLATFORM_SOLARIS }, { "cygwin", PLATFORM_CYGWIN }, { "mingw32", PLATFORM_WINDOWS }, @@ -229,6 +230,8 @@ static const enum target_cpu build_cpu = #ifdef __APPLE__ static enum target_platform build_platform = PLATFORM_APPLE; +#elif defined(__FreeBSD__) +static enum target_platform build_platform = PLATFORM_FREEBSD; #elif defined(__sun) static enum target_platform build_platform = PLATFORM_SOLARIS; #elif defined(__CYGWIN__) @@ -466,9 +469,10 @@ static void compile(struct options* opts strarray_add(comp_args, "-D_fastcall=__attribute__((ms_abi))"); fastcall_done = 1; } - else if (opts->target_platform == PLATFORM_APPLE) + else if ((opts->target_platform == PLATFORM_APPLE) || + (opts->target_platform == PLATFORM_FREEBSD)) { - /* Mac OS X uses a 16-byte aligned stack and not a 4-byte one */ + /* Mac OS X and FreeBSD 10 use a 16-byte aligned stack and not a 4-byte one */ strarray_add(comp_args, "-D__stdcall=__attribute__((__stdcall__)) __attribute__((__force_align_arg_pointer__))"); strarray_add(comp_args, "-D__cdecl=__attribute__((__cdecl__)) __attribute__((__force_align_arg_pointer__))"); strarray_add(comp_args, "-D_stdcall=__attribute__((__stdcall__)) __attribute__((__force_align_arg_pointer__))"); --=-=-=--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1TUlad-0008bB-OF>