Signed-off-by: Chip Davis cdavis@codeweavers.com --- dlls/mshtml/htmlevent.c | 11 +++++++++++ dlls/mshtml/nsembed.c | 10 ++++++++++ dlls/ole32/stg_prop.c | 14 +++++++++++++- dlls/riched20/editor.h | 2 +- dlls/riched20/editstr.h | 6 +++++- dlls/riched20/txthost.c | 8 ++++---- dlls/riched20/txtsrv.c | 12 ++++++------ include/windef.h | 22 ++++++++++++++++++++-- include/wine/asm.h | 26 +++++++++++++++++++------- 9 files changed, 89 insertions(+), 22 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 4cf994587fc..a4fb47ba25e 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -1024,12 +1024,23 @@ static HRESULT WINAPI DOMEvent_get_type(IDOMEvent *iface, BSTR *p) }
#ifdef __i386__ + +#if defined(__MINGW32__) || (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || __has_attribute(thiscall) + +#define nsIDOMEvent_InitEvent(_this,type,bubbles,cancelable) \ + ((void (__thiscall*)(nsIDOMEvent*,const nsAString*,cpp_bool,cpp_bool)) \ + (_this)->lpVtbl->InitEvent)(_this,type,bubbles,cancelable) + +#else + #define nsIDOMEvent_InitEvent(_this,type,bubbles,cancelable) \ ((void (WINAPI*)(void*,nsIDOMEvent*,const nsAString*,cpp_bool,cpp_bool)) \ &call_thiscall_func)((_this)->lpVtbl->InitEvent,_this,type,bubbles,cancelable)
#endif
+#endif + static HRESULT WINAPI DOMEvent_initEvent(IDOMEvent *iface, BSTR type, VARIANT_BOOL can_bubble, VARIANT_BOOL cancelable) { DOMEvent *This = impl_from_IDOMEvent(iface); diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c index 244341248ed..af66861ad48 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -2343,6 +2343,13 @@ void detach_gecko_browser(GeckoBrowser *This) * This will be removed after the next Gecko update, that will change calling convention on Gecko side. */ #ifdef __i386__ + +#if defined(__MINGW32__) || (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || __has_attribute(thiscall) + +#define nsIScriptObjectPrincipal_GetPrincipal(this) ((void* (__thiscall*)(void*))(this)->lpVtbl->GetPrincipal)(this) + +#else + __ASM_GLOBAL_FUNC(call_thiscall_func, "popl %eax\n\t" "popl %edx\n\t" @@ -2350,6 +2357,9 @@ __ASM_GLOBAL_FUNC(call_thiscall_func, "pushl %eax\n\t" "jmp *%edx\n\t") #define nsIScriptObjectPrincipal_GetPrincipal(this) ((void* (WINAPI*)(void*,void*))&call_thiscall_func)((this)->lpVtbl->GetPrincipal,this) + +#endif + #endif
nsIXMLHttpRequest *create_nsxhr(nsIDOMWindow *nswindow) diff --git a/dlls/ole32/stg_prop.c b/dlls/ole32/stg_prop.c index 708147e51dc..0ee38d11abd 100644 --- a/dlls/ole32/stg_prop.c +++ b/dlls/ole32/stg_prop.c @@ -2896,7 +2896,17 @@ end: return hr; }
-#ifdef __i386__ /* thiscall functions are i386-specific */ +#if defined(__i386__) /* thiscall functions are i386-specific */ + +#if defined(__MINGW32__) || (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || __has_attribute(thiscall) + +static void* __thiscall Allocate_PMemoryAllocator(void *this, ULONG cbSize) +{ + void* (__thiscall *fn)(void*,ULONG) = **(void***)this; + return fn(this, cbSize); +} + +#else
#define DEFINE_STDCALL_WRAPPER(num,func,args) \ __ASM_STDCALL_FUNC(func, args, \ @@ -2909,6 +2919,8 @@ end: DEFINE_STDCALL_WRAPPER(0,Allocate_PMemoryAllocator,8) extern void* WINAPI Allocate_PMemoryAllocator(void *this, ULONG cbSize);
+#endif + #else
static void* WINAPI Allocate_PMemoryAllocator(void *this, ULONG cbSize) diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index 1f033b4187c..e49d96e864f 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -276,7 +276,7 @@ void ME_InitTableDef(ME_TextEditor *editor, struct RTFTable *tableDef) DECLSPEC_
/* txthost.c */ ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion10) DECLSPEC_HIDDEN; -#if defined(__i386__) && !defined(__MINGW32__) /* Use wrappers to perform thiscall on i386 */ +#if defined(__i386__) && !defined(HAVE_THISCALL) /* Use wrappers to perform thiscall on i386 */ #define TXTHOST_VTABLE(This) (&itextHostStdcallVtbl) #else /* __i386__ */ #define TXTHOST_VTABLE(This) (This)->lpVtbl diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h index a2e6f8584b7..df39d8143d4 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -51,7 +51,11 @@ #include "wine/heap.h" #include "wine/list.h"
-#if defined(__i386__) && !defined(__MINGW32__) +#if defined(__MINGW32__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || __has_attribute(thiscall) +# define HAVE_THISCALL +#endif + +#if defined(__i386__) && !defined(HAVE_THISCALL) extern const struct ITextHostVtbl itextHostStdcallVtbl DECLSPEC_HIDDEN; #endif /* __i386__ */
diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c index 3f25625ed52..cffa8efa1a3 100644 --- a/dlls/riched20/txthost.c +++ b/dlls/riched20/txthost.c @@ -69,7 +69,7 @@ static inline ITextHostImpl *impl_from_ITextHost(ITextHost *iface) return CONTAINING_RECORD(iface, ITextHostImpl, ITextHost_iface); }
-static HRESULT WINAPI ITextHostImpl_QueryInterface(ITextHost *iface, REFIID riid, void **ppvObject) +static HRESULT STDMETHODCALLTYPE ITextHostImpl_QueryInterface(ITextHost *iface, REFIID riid, void **ppvObject) { ITextHostImpl *This = impl_from_ITextHost(iface);
@@ -83,14 +83,14 @@ static HRESULT WINAPI ITextHostImpl_QueryInterface(ITextHost *iface, REFIID riid return E_NOINTERFACE; }
-static ULONG WINAPI ITextHostImpl_AddRef(ITextHost *iface) +static ULONG STDMETHODCALLTYPE ITextHostImpl_AddRef(ITextHost *iface) { ITextHostImpl *This = impl_from_ITextHost(iface); ULONG ref = InterlockedIncrement(&This->ref); return ref; }
-static ULONG WINAPI ITextHostImpl_Release(ITextHost *iface) +static ULONG STDMETHODCALLTYPE ITextHostImpl_Release(ITextHost *iface) { ITextHostImpl *This = impl_from_ITextHost(iface); ULONG ref = InterlockedDecrement(&This->ref); @@ -522,7 +522,7 @@ DECLSPEC_HIDDEN HRESULT __thiscall ITextHostImpl_TxGetSelectionBarWidth(ITextHos }
-#if defined(__i386__) && !defined(__MINGW32__) /* thiscall functions are i386-specific */ +#if defined(__i386__) && !defined(HAVE_THISCALL) /* thiscall functions are i386-specific */
#define STDCALL(func) (void *) __stdcall_ ## func #ifdef _MSC_VER diff --git a/dlls/riched20/txtsrv.c b/dlls/riched20/txtsrv.c index 12761621c4c..8ded7b8b5a7 100644 --- a/dlls/riched20/txtsrv.c +++ b/dlls/riched20/txtsrv.c @@ -49,7 +49,7 @@ static inline ITextServicesImpl *impl_from_IUnknown(IUnknown *iface) return CONTAINING_RECORD(iface, ITextServicesImpl, IUnknown_inner); }
-static HRESULT WINAPI ITextServicesImpl_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) +static HRESULT STDMETHODCALLTYPE ITextServicesImpl_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) { ITextServicesImpl *This = impl_from_IUnknown(iface);
@@ -75,7 +75,7 @@ static HRESULT WINAPI ITextServicesImpl_QueryInterface(IUnknown *iface, REFIID r return S_OK; }
-static ULONG WINAPI ITextServicesImpl_AddRef(IUnknown *iface) +static ULONG STDMETHODCALLTYPE ITextServicesImpl_AddRef(IUnknown *iface) { ITextServicesImpl *This = impl_from_IUnknown(iface); LONG ref = InterlockedIncrement(&This->ref); @@ -85,7 +85,7 @@ static ULONG WINAPI ITextServicesImpl_AddRef(IUnknown *iface) return ref; }
-static ULONG WINAPI ITextServicesImpl_Release(IUnknown *iface) +static ULONG STDMETHODCALLTYPE ITextServicesImpl_Release(IUnknown *iface) { ITextServicesImpl *This = impl_from_IUnknown(iface); LONG ref = InterlockedDecrement(&This->ref); @@ -114,19 +114,19 @@ static inline ITextServicesImpl *impl_from_ITextServices(ITextServices *iface) return CONTAINING_RECORD(iface, ITextServicesImpl, ITextServices_iface); }
-static HRESULT WINAPI fnTextSrv_QueryInterface(ITextServices *iface, REFIID riid, void **ppv) +static HRESULT STDMETHODCALLTYPE fnTextSrv_QueryInterface(ITextServices *iface, REFIID riid, void **ppv) { ITextServicesImpl *This = impl_from_ITextServices(iface); return IUnknown_QueryInterface(This->outer_unk, riid, ppv); }
-static ULONG WINAPI fnTextSrv_AddRef(ITextServices *iface) +static ULONG STDMETHODCALLTYPE fnTextSrv_AddRef(ITextServices *iface) { ITextServicesImpl *This = impl_from_ITextServices(iface); return IUnknown_AddRef(This->outer_unk); }
-static ULONG WINAPI fnTextSrv_Release(ITextServices *iface) +static ULONG STDMETHODCALLTYPE fnTextSrv_Release(ITextServices *iface) { ITextServicesImpl *This = impl_from_ITextServices(iface); return IUnknown_Release(This->outer_unk); diff --git a/include/windef.h b/include/windef.h index b52f5eb836c..8169bd112f3 100644 --- a/include/windef.h +++ b/include/windef.h @@ -119,8 +119,26 @@ extern "C" { #endif /* __fastcall */
#ifndef __thiscall -# define __thiscall __stdcall -#endif +# ifdef __i386__ +# ifdef __GNUC__ +# if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +# define __thiscall __attribute__((__thiscall__, __force_align_arg_pointer__)) +# elif defined(__has_attribute) +# if __has_attribute(thiscall) +# define __thiscall __attribute__((__thiscall__, __force_align_arg_pointer__)) +# else +# define __thiscall __stdcall +# endif +# else +# define __thiscall __stdcall +# endif +# else +# define __thiscall __stdcall +# endif +# else +# define __thiscall __stdcall +# endif +#endif /* __thiscall */
#ifndef __ms_va_list # if (defined(__x86_64__) || defined(__aarch64__)) && defined (__GNUC__) diff --git a/include/wine/asm.h b/include/wine/asm.h index c45d84c7307..e71cb959acc 100644 --- a/include/wine/asm.h +++ b/include/wine/asm.h @@ -110,7 +110,18 @@
#if defined(__i386__) && !defined(__MINGW32__)
-# ifdef _MSC_VER +# ifndef __has_attribute +# define __has_attribute(a) 0 +# endif + +# if __has_attribute(thiscall) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +/* winebuild still uses the thunk names */ +# define DEFINE_THISCALL_WRAPPER(func,args) \ + __ASM_GLOBAL( ".globl " __ASM_STDCALL("__thiscall_" #func, args) "\n\t" \ + __ASM_STDCALL("__thiscall_" #func, args) " = " __ASM_NAME(#func) "\n\t" ); +# define THISCALL(func) func +# define THISCALL_NAME(func) __ASM_NAME(#func) +# elif defined(_MSC_VER) # define DEFINE_THISCALL_WRAPPER(func,args) \ __declspec(naked) void __thiscall_##func(void) \ { __asm { \ @@ -119,19 +130,20 @@ push eax \ jmp func \ } } +# define THISCALL(func) (void *)__thiscall_ ## func +# define THISCALL_NAME(func) __ASM_NAME("__thiscall_" #func) # else /* _MSC_VER */ # define DEFINE_THISCALL_WRAPPER(func,args) \ extern void __thiscall_ ## func(void); \ __ASM_STDCALL_FUNC( __thiscall_ ## func, args, \ - "popl %eax\n\t" \ - "pushl %ecx\n\t" \ - "pushl %eax\n\t" \ + "popl %eax\n\t" \ + "pushl %ecx\n\t" \ + "pushl %eax\n\t" \ "jmp " __ASM_STDCALL(#func,args) ) +# define THISCALL(func) (void *)__thiscall_ ## func +# define THISCALL_NAME(func) __ASM_NAME("__thiscall_" #func) # endif /* _MSC_VER */
-# define THISCALL(func) (void *)__thiscall_ ## func -# define THISCALL_NAME(func) __ASM_NAME("__thiscall_" #func) - #else /* __i386__ */
# define DEFINE_THISCALL_WRAPPER(func,args) /* nothing */