[PATCH 1/2] include: Use __fastcall directly in winelib builds, too.
Chip Davis
cdavis at codeweavers.com
Sun Nov 24 19:36:34 CST 2019
It's still not safe to call a __fastcall function from Wine source,
though, since we can't rely on this being present.
winebuild still wants the old wrapper names, so for now we define
aliases.
Signed-off-by: Chip Davis <cdavis at codeweavers.com>
---
dlls/hal/hal.c | 2 +-
include/ddk/wdm.h | 6 +++---
include/windef.h | 21 +++++++++++++++------
include/wine/asm.h | 26 +++++++++++++++++++-------
4 files changed, 38 insertions(+), 17 deletions(-)
diff --git a/dlls/hal/hal.c b/dlls/hal/hal.c
index 21ce6e12c99..2365cac57d0 100644
--- a/dlls/hal/hal.c
+++ b/dlls/hal/hal.c
@@ -34,7 +34,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(ntoskrnl);
#ifdef __i386__
-#ifndef _WIN32
+#if !defined(_WIN32) && ((__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4))
extern void * WINAPI wrap_fastcall_func1( void *func, const void *a );
__ASM_STDCALL_FUNC( wrap_fastcall_func1, 8,
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index a092216b824..3094fdbe42d 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1554,9 +1554,9 @@ ULONG WINAPI ExGetSharedWaiterCount(ERESOURCE*);
void WINAPI ExInitializeNPagedLookasideList(PNPAGED_LOOKASIDE_LIST,PALLOCATE_FUNCTION,PFREE_FUNCTION,ULONG,SIZE_T,ULONG,USHORT);
void WINAPI ExInitializePagedLookasideList(PPAGED_LOOKASIDE_LIST,PALLOCATE_FUNCTION,PFREE_FUNCTION,ULONG,SIZE_T,ULONG,USHORT);
NTSTATUS WINAPI ExInitializeResourceLite(ERESOURCE*);
-PSLIST_ENTRY WINAPI ExInterlockedFlushSList(PSLIST_HEADER);
-PSLIST_ENTRY WINAPI ExInterlockedPopEntrySList(PSLIST_HEADER,PKSPIN_LOCK);
-PSLIST_ENTRY WINAPI ExInterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY,PKSPIN_LOCK);
+PSLIST_ENTRY FASTCALL ExInterlockedFlushSList(PSLIST_HEADER);
+PSLIST_ENTRY FASTCALL ExInterlockedPopEntrySList(PSLIST_HEADER,PKSPIN_LOCK);
+PSLIST_ENTRY FASTCALL ExInterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY,PKSPIN_LOCK);
LIST_ENTRY * WINAPI ExInterlockedRemoveHeadList(LIST_ENTRY*,KSPIN_LOCK*);
BOOLEAN WINAPI ExIsResourceAcquiredExclusiveLite(ERESOURCE*);
ULONG WINAPI ExIsResourceAcquiredSharedLite(ERESOURCE*);
diff --git a/include/windef.h b/include/windef.h
index 0074d5cf6c4..b52f5eb836c 100644
--- a/include/windef.h
+++ b/include/windef.h
@@ -101,10 +101,22 @@ extern "C" {
#endif /* __cdecl */
#ifndef __fastcall
-# ifndef _MSC_VER
+# ifdef __i386__
+# ifdef __GNUC__
+# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 2)) || defined(__APPLE__)
+# define __fastcall __attribute__((__fastcall__)) __attribute__((__force_align_arg_pointer__))
+# elif (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))
+# define __fastcall __attribute__((__fastcall__))
+# else
+# define __fastcall __stdcall
+# endif
+# elif !defined(_MSC_VER)
+# define __fastcall __stdcall
+# endif
+# else
# define __fastcall __stdcall
# endif
-#endif
+#endif /* __fastcall */
#ifndef __thiscall
# define __thiscall __stdcall
@@ -150,10 +162,7 @@ extern "C" {
#define _stdcall __ONLY_IN_WINELIB(__stdcall)
#endif
#ifndef _fastcall
-#define _fastcall __ONLY_IN_WINELIB(__stdcall)
-#endif
-#ifndef __fastcall
-#define __fastcall __ONLY_IN_WINELIB(__stdcall)
+#define _fastcall __ONLY_IN_WINELIB(__fastcall)
#endif
#ifndef __export
#define __export __ONLY_IN_WINELIB(__stdcall)
diff --git a/include/wine/asm.h b/include/wine/asm.h
index 8c664476ef1..c45d84c7307 100644
--- a/include/wine/asm.h
+++ b/include/wine/asm.h
@@ -29,8 +29,10 @@
#if defined(_WIN32) && defined(__i386__)
# define __ASM_STDCALL(name,args) __ASM_NAME(name) "@" #args
+# define __ASM_FASTCALL(name, args) "@" name "@" #args
#else
# define __ASM_STDCALL(name,args) __ASM_NAME(name)
+# define __ASM_FASTCALL(name, args) __ASM_NAME(name)
#endif
#if defined(__GCC_HAVE_DWARF2_CFI_ASM) || defined(__APPLE__)
@@ -56,22 +58,22 @@
#endif
#ifdef __GNUC__
-# define __ASM_DEFINE_FUNC(name,code) \
- asm(".text\n\t.align 4\n\t.globl " name "\n\t" __ASM_FUNC_TYPE(name) __ASM_SEH("\n\t.seh_proc " name) "\n" name ":\n\t" \
- __ASM_CFI(".cfi_startproc\n\t") code __ASM_CFI("\n\t.cfi_endproc") __ASM_SEH("\n\t.seh_endproc") );
+# define __ASM_GLOBAL(code) asm(code);
#else
-# define __ASM_DEFINE_FUNC(name,code) void __asm_dummy_##__LINE__(void) { \
- asm(".text\n\t.align 4\n\t.globl " name "\n\t" __ASM_FUNC_TYPE(name) __ASM_SEH("\n\t.seh_proc " name) "\n" name ":\n\t" \
- __ASM_CFI(".cfi_startproc\n\t") code __ASM_CFI("\n\t.cfi_endproc") __ASM_SEH("\n\t.seh_endproc") ); }
+# define __ASM_GLOBAL(code) void __asm_dummy_##__LINE__(void) { asm(code); }
#endif
+#define __ASM_DEFINE_FUNC(name,code) \
+ __ASM_GLOBAL( ".text\n\t.align 4\n\t.globl " name "\n\t" __ASM_FUNC_TYPE(name) __ASM_SEH("\n\t.seh_proc " name) "\n" name ":\n\t" \
+ __ASM_CFI(".cfi_startproc\n\t") code __ASM_CFI("\n\t.cfi_endproc") __ASM_SEH("\n\t.seh_endproc") );
+
#define __ASM_GLOBAL_FUNC(name,code) __ASM_DEFINE_FUNC(__ASM_NAME(#name),code)
#define __ASM_STDCALL_FUNC(name,args,code) __ASM_DEFINE_FUNC(__ASM_STDCALL(#name,args),code)
/* fastcall support */
-#if defined(__i386__) && !defined(_WIN32)
+#if defined(__i386__) && !defined(_WIN32) && ((__GNUC__ < 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ < 4)))
# define DEFINE_FASTCALL1_WRAPPER(func) \
__ASM_STDCALL_FUNC( __fastcall_ ## func, 4, \
@@ -87,6 +89,16 @@
"pushl %eax\n\t" \
"jmp " __ASM_STDCALL(#func,args) )
+#elif defined(__i386__) && !defined(_WIN32)
+
+/* winebuild still uses the thunk names, so provide them */
+# define DEFINE_FASTCALL1_WRAPPER(func) \
+ __ASM_GLOBAL( ".globl " __ASM_STDCALL("__fastcall_" #func, 4) "\n\t" \
+ __ASM_STDCALL("__fastcall_" #func, 4) " = " __ASM_FASTCALL(#func, 4) "\n\t" );
+# define DEFINE_FASTCALL_WRAPPER(func,args) \
+ __ASM_GLOBAL( ".globl " __ASM_STDCALL("__fastcall_" #func, args) "\n\t" \
+ __ASM_STDCALL("__fastcall_" #func, args) " = " __ASM_FASTCALL(#func, args) "\n\t" );
+
#else /* __i386__ */
# define DEFINE_FASTCALL1_WRAPPER(func) /* nothing */
--
2.21.0
More information about the wine-devel
mailing list