widl: Update to Wine 6.12 This allows picking up the target CPU from a tool name prefix, and allows using -m32/-m64 on arm/aarch64. Signed-off-by: Martin Storsjö <martin@martin.st>
diff --git a/mingw-w64-tools/widl/VERSION b/mingw-w64-tools/widl/VERSION index 2e75a15..01f38bd 100644 --- a/mingw-w64-tools/widl/VERSION +++ b/mingw-w64-tools/widl/VERSION
@@ -1 +1 @@ -WIDL version 6.4 +WIDL version 6.12
diff --git a/mingw-w64-tools/widl/configure b/mingw-w64-tools/widl/configure index 75cf93f..7be7336 100755 --- a/mingw-w64-tools/widl/configure +++ b/mingw-w64-tools/widl/configure
@@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for widl 6.4. +# Generated by GNU Autoconf 2.71 for widl 6.12. # # Report bugs to <mingw-w64-public@lists.sourceforge.net>. # @@ -610,8 +610,8 @@ # Identity of this package. PACKAGE_NAME='widl' PACKAGE_TARNAME='widl' -PACKAGE_VERSION='6.4' -PACKAGE_STRING='widl 6.4' +PACKAGE_VERSION='6.12' +PACKAGE_STRING='widl 6.12' PACKAGE_BUGREPORT='mingw-w64-public@lists.sourceforge.net' PACKAGE_URL='' @@ -1316,7 +1316,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures widl 6.4 to adapt to many kinds of systems. +\`configure' configures widl 6.12 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1388,7 +1388,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of widl 6.4:";; + short | recursive ) echo "Configuration of widl 6.12:";; esac cat <<\_ACEOF @@ -1490,7 +1490,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -widl configure 6.4 +widl configure 6.12 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -1902,7 +1902,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by widl $as_me 6.4, which was +It was created by widl $as_me 6.12, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3293,7 +3293,7 @@ # Define the identity of the package. PACKAGE='widl' - VERSION='6.4' + VERSION='6.12' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -5767,7 +5767,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by widl $as_me 6.4, which was +This file was extended by widl $as_me 6.12, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -5835,7 +5835,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -widl config.status 6.4 +widl config.status 6.12 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\"
diff --git a/mingw-w64-tools/widl/include/winbase.h b/mingw-w64-tools/widl/include/winbase.h index 651da6d..2928385 100644 --- a/mingw-w64-tools/widl/include/winbase.h +++ b/mingw-w64-tools/widl/include/winbase.h
@@ -679,6 +679,7 @@ #define PROFILE_USER 0x10000000 #define PROFILE_KERNEL 0x20000000 #define PROFILE_SERVER 0x40000000 +#define CREATE_IGNORE_SYSTEM_DEFAULT 0x80000000 #define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000 @@ -2274,6 +2275,7 @@ WINBASEAPI VOID WINAPI GetStartupInfoW(LPSTARTUPINFOW); #define GetStartupInfo WINELIB_NAME_AW(GetStartupInfo) WINBASEAPI HANDLE WINAPI GetStdHandle(DWORD); +WINBASEAPI BOOL WINAPI GetSystemCpuSetInformation(SYSTEM_CPU_SET_INFORMATION*,ULONG,ULONG*,HANDLE,ULONG); WINBASEAPI UINT WINAPI GetSystemDirectoryA(LPSTR,UINT); WINBASEAPI UINT WINAPI GetSystemDirectoryW(LPWSTR,UINT); #define GetSystemDirectory WINELIB_NAME_AW(GetSystemDirectory) @@ -2747,6 +2749,7 @@ WINBASEAPI LPVOID WINAPI VirtualAlloc2(HANDLE,LPVOID,SIZE_T,DWORD,DWORD,MEM_EXTENDED_PARAMETER*,ULONG); WINBASEAPI LPVOID WINAPI VirtualAllocEx(HANDLE,LPVOID,SIZE_T,DWORD,DWORD); WINBASEAPI LPVOID WINAPI VirtualAllocExNuma(HANDLE,void*,SIZE_T,DWORD,DWORD,DWORD); +WINBASEAPI LPVOID WINAPI VirtualAllocFromApp(LPVOID,SIZE_T,DWORD,DWORD); WINBASEAPI BOOL WINAPI VirtualFree(LPVOID,SIZE_T,DWORD); WINBASEAPI BOOL WINAPI VirtualFreeEx(HANDLE,LPVOID,SIZE_T,DWORD); WINBASEAPI BOOL WINAPI VirtualLock(LPVOID,SIZE_T); @@ -2885,9 +2888,11 @@ return strcat( dst, src ); } -/* strncpy doesn't do what you think, don't use it */ +/* strncpy/wcsncpy don't do what you think, don't use them */ #undef strncpy +#undef wcsncpy #define strncpy(d,s,n) error do_not_use_strncpy_use_lstrcpynA_or_memcpy_instead +#define wcsncpy(d,s,n) error do_not_use_wcsncpy_use_lstrcpynW_or_memcpy_instead #endif /* !defined(__WINESRC__) || defined(WINE_NO_INLINE_STRING) */
diff --git a/mingw-w64-tools/widl/include/winerror.h b/mingw-w64-tools/widl/include/winerror.h index 86f7aac..f22b24f 100644 --- a/mingw-w64-tools/widl/include/winerror.h +++ b/mingw-w64-tools/widl/include/winerror.h
@@ -410,6 +410,7 @@ #define ERROR_THREAD_MODE_NOT_BACKGROUND 401 #define ERROR_PROCESS_MODE_ALREADY_BACKGROUND 402 #define ERROR_PROCESS_MODE_NOT_BACKGROUND 403 +#define ERROR_NO_SUCH_DEVICE 433 #define ERROR_PNP_QUERY_REMOVE_DEVICE_TIMEOUT 480 #define ERROR_PNP_QUERY_REMOVE_RELATED_DEVICE_TIMEOUT 481 #define ERROR_PNP_QUERY_REMOVE_UNRELATED_DEVICE_TIMEOUT 482 @@ -3638,6 +3639,29 @@ #define DWM_E_ADAPTER_NOT_FOUND _HRESULT_TYPEDEF_(0x80263005) #define DWM_S_GDI_REDIRECTION_SURFACE _HRESULT_TYPEDEF_(0x00263005) +#define TBS_E_INTERNAL_ERROR _HRESULT_TYPEDEF_(0x80284001) +#define TBS_E_BAD_PARAMETER _HRESULT_TYPEDEF_(0x80284002) +#define TBS_E_INVALID_OUTPUT_POINTER _HRESULT_TYPEDEF_(0x80284003) +#define TBS_E_INVALID_CONTEXT _HRESULT_TYPEDEF_(0x80284004) +#define TBS_E_INSUFFICIENT_BUFFER _HRESULT_TYPEDEF_(0x80284005) +#define TBS_E_IOERROR _HRESULT_TYPEDEF_(0x80284006) +#define TBS_E_INVALID_CONTEXT_PARAM _HRESULT_TYPEDEF_(0x80284007) +#define TBS_E_SERVICE_NOT_RUNNING _HRESULT_TYPEDEF_(0x80284008) +#define TBS_E_TOO_MANY_TBS_CONTEXTS _HRESULT_TYPEDEF_(0x80284009) +#define TBS_E_TOO_MANY_RESOURCES _HRESULT_TYPEDEF_(0x8028400a) +#define TBS_E_SERVICE_START_PENDING _HRESULT_TYPEDEF_(0x8028400b) +#define TBS_E_PPI_NOT_SUPPORTED _HRESULT_TYPEDEF_(0x8028400c) +#define TBS_E_COMMAND_CANCELED _HRESULT_TYPEDEF_(0x8028400d) +#define TBS_E_BUFFER_TOO_LARGE _HRESULT_TYPEDEF_(0x8028400e) +#define TBS_E_TPM_NOT_FOUND _HRESULT_TYPEDEF_(0x8028400f) +#define TBS_E_SERVICE_DISABLED _HRESULT_TYPEDEF_(0x80284010) +#define TBS_E_NO_EVENT_LOG _HRESULT_TYPEDEF_(0x80284011) +#define TBS_E_ACCESS_DENIED _HRESULT_TYPEDEF_(0x80284012) +#define TBS_E_PROVISIONING_NOT_ALLOWED _HRESULT_TYPEDEF_(0x80284013) +#define TBS_E_PPI_FUNCTION_UNSUPPORTED _HRESULT_TYPEDEF_(0x80284014) +#define TBS_E_OWNERAUTH_NOT_FOUND _HRESULT_TYPEDEF_(0x80284015) +#define TBS_E_PROVISIONING_INCOMPLETE _HRESULT_TYPEDEF_(0x80284016) + #define UI_E_CREATE_FAILED _HRESULT_TYPEDEF_(0x802a0001) #define UI_E_SHUTDOWN_CALLED _HRESULT_TYPEDEF_(0x802a0002) #define UI_E_ILLEGAL_REENTRANCY _HRESULT_TYPEDEF_(0x802a0003)
diff --git a/mingw-w64-tools/widl/include/winnt.h b/mingw-w64-tools/widl/include/winnt.h index 9025e96..b83f588 100644 --- a/mingw-w64-tools/widl/include/winnt.h +++ b/mingw-w64-tools/widl/include/winnt.h
@@ -291,7 +291,7 @@ #undef __C89_NAMELESSUNIONNAME7 #undef __C89_NAMELESSUNIONNAME8 -#if !defined(__WINESRC__) && !defined(WINE_NO_NAMELESS_EXTENSION) +#if !defined(WINE_NO_NAMELESS_EXTENSION) # ifdef __GNUC__ /* Anonymous structs support starts with gcc 2.96/g++ 2.95 */ # if (__GNUC__ > 2) || ((__GNUC__ == 2) && ((__GNUC_MINOR__ > 95) || ((__GNUC_MINOR__ == 95) && defined(__cplusplus)))) @@ -369,7 +369,7 @@ /* Alignment macros */ -#if defined(_WIN64) || (defined(_MSC_VER) && defined(_M_ALPHA)) || defined(__alpha__) +#ifdef _WIN64 #define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG) #define MEMORY_ALLOCATION_ALIGNMENT 16 #else @@ -977,22 +977,13 @@ #include <excpt.h> -struct _CONTEXT; -struct _EXCEPTION_POINTERS; -struct _EXCEPTION_RECORD; - -typedef EXCEPTION_DISPOSITION WINAPI EXCEPTION_ROUTINE(struct _EXCEPTION_RECORD*,PVOID, - struct _CONTEXT*,PVOID); -typedef EXCEPTION_ROUTINE *PEXCEPTION_ROUTINE; - /* The Win32 register context */ /* i386 context definitions */ -#ifdef __i386__ -#define SIZE_OF_80387_REGISTERS 80 +#define I386_SIZE_OF_80387_REGISTERS 80 -typedef struct _FLOATING_SAVE_AREA +typedef struct _I386_FLOATING_SAVE_AREA { DWORD ControlWord; DWORD StatusWord; @@ -1001,13 +992,14 @@ DWORD ErrorSelector; DWORD DataOffset; DWORD DataSelector; - BYTE RegisterArea[SIZE_OF_80387_REGISTERS]; + BYTE RegisterArea[I386_SIZE_OF_80387_REGISTERS]; DWORD Cr0NpxState; -} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; +} I386_FLOATING_SAVE_AREA, WOW64_FLOATING_SAVE_AREA, *PWOW64_FLOATING_SAVE_AREA; -#define MAXIMUM_SUPPORTED_EXTENSION 512 +#define I386_MAXIMUM_SUPPORTED_EXTENSION 512 -typedef struct _CONTEXT +#include "pshpack4.h" +typedef struct _I386_CONTEXT { DWORD ContextFlags; /* 000 */ @@ -1020,7 +1012,7 @@ DWORD Dr7; /* 018 */ /* These are selected by CONTEXT_FLOATING_POINT */ - FLOATING_SAVE_AREA FloatSave; /* 01c */ + I386_FLOATING_SAVE_AREA FloatSave; /* 01c */ /* These are selected by CONTEXT_SEGMENTS */ DWORD SegGs; /* 08c */ @@ -1044,27 +1036,39 @@ DWORD Esp; /* 0c4 */ DWORD SegSs; /* 0c8 */ - BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; /* 0xcc */ -} CONTEXT, *PCONTEXT; + BYTE ExtendedRegisters[I386_MAXIMUM_SUPPORTED_EXTENSION]; /* 0xcc */ +} I386_CONTEXT, WOW64_CONTEXT, *PWOW64_CONTEXT; +#include "poppack.h" -#define CONTEXT_X86 0x00010000 -#define CONTEXT_i386 CONTEXT_X86 -#define CONTEXT_i486 CONTEXT_X86 +#define CONTEXT_i386 0x00010000 +#define CONTEXT_i486 0x00010000 -#define CONTEXT_CONTROL (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */ -#define CONTEXT_INTEGER (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */ -#define CONTEXT_SEGMENTS (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */ -#define CONTEXT_FLOATING_POINT (CONTEXT_i386 | 0x0008) /* 387 state */ -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010) /* DB 0-3,6,7 */ -#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386 | 0x0020) -#define CONTEXT_XSTATE (CONTEXT_i386 | 0x0040) -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \ - CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS) +#define CONTEXT_I386_CONTROL (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */ +#define CONTEXT_I386_INTEGER (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */ +#define CONTEXT_I386_SEGMENTS (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */ +#define CONTEXT_I386_FLOATING_POINT (CONTEXT_i386 | 0x0008) /* 387 state */ +#define CONTEXT_I386_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010) /* DB 0-3,6,7 */ +#define CONTEXT_I386_EXTENDED_REGISTERS (CONTEXT_i386 | 0x0020) +#define CONTEXT_I386_XSTATE (CONTEXT_i386 | 0x0040) +#define CONTEXT_I386_FULL (CONTEXT_I386_CONTROL | CONTEXT_I386_INTEGER | CONTEXT_I386_SEGMENTS) +#define CONTEXT_I386_ALL (CONTEXT_I386_FULL | CONTEXT_I386_FLOATING_POINT | CONTEXT_I386_DEBUG_REGISTERS | CONTEXT_I386_EXTENDED_REGISTERS) -#define EXCEPTION_READ_FAULT 0 -#define EXCEPTION_WRITE_FAULT 1 -#define EXCEPTION_EXECUTE_FAULT 8 +#ifdef __i386__ + +#define CONTEXT_CONTROL CONTEXT_I386_CONTROL +#define CONTEXT_INTEGER CONTEXT_I386_INTEGER +#define CONTEXT_SEGMENTS CONTEXT_I386_SEGMENTS +#define CONTEXT_FLOATING_POINT CONTEXT_I386_FLOATING_POINT +#define CONTEXT_DEBUG_REGISTERS CONTEXT_I386_DEBUG_REGISTERS +#define CONTEXT_EXTENDED_REGISTERS CONTEXT_I386_EXTENDED_REGISTERS +#define CONTEXT_XSTATE CONTEXT_I386_XSTATE +#define CONTEXT_FULL CONTEXT_I386_FULL +#define CONTEXT_ALL CONTEXT_I386_ALL +#define SIZE_OF_80387_REGISTERS I386_SIZE_OF_80387_REGISTERS +#define MAXIMUM_SUPPORTED_EXTENSION I386_MAXIMUM_SUPPORTED_EXTENSION + +typedef I386_FLOATING_SAVE_AREA FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; +typedef I386_CONTEXT CONTEXT, *PCONTEXT; #endif /* __i386__ */ @@ -1118,26 +1122,28 @@ } XSAVE_FORMAT, *PXSAVE_FORMAT; /* x86-64 context definitions */ -#if defined(__x86_64__) + +typedef struct _AMD64_RUNTIME_FUNCTION +{ + DWORD BeginAddress; + DWORD EndAddress; + DWORD UnwindData; +} AMD64_RUNTIME_FUNCTION; #define CONTEXT_AMD64 0x00100000 -#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x0001) -#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x0002) -#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x0004) -#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x0008) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x0010) -#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x0040) -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) - -#define EXCEPTION_READ_FAULT 0 -#define EXCEPTION_WRITE_FAULT 1 -#define EXCEPTION_EXECUTE_FAULT 8 +#define CONTEXT_AMD64_CONTROL (CONTEXT_AMD64 | 0x0001) +#define CONTEXT_AMD64_INTEGER (CONTEXT_AMD64 | 0x0002) +#define CONTEXT_AMD64_SEGMENTS (CONTEXT_AMD64 | 0x0004) +#define CONTEXT_AMD64_FLOATING_POINT (CONTEXT_AMD64 | 0x0008) +#define CONTEXT_AMD64_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x0010) +#define CONTEXT_AMD64_XSTATE (CONTEXT_AMD64 | 0x0040) +#define CONTEXT_AMD64_FULL (CONTEXT_AMD64_CONTROL | CONTEXT_AMD64_INTEGER | CONTEXT_AMD64_FLOATING_POINT) +#define CONTEXT_AMD64_ALL (CONTEXT_AMD64_CONTROL | CONTEXT_AMD64_INTEGER | CONTEXT_AMD64_SEGMENTS | CONTEXT_AMD64_FLOATING_POINT | CONTEXT_AMD64_DEBUG_REGISTERS) typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; -typedef struct DECLSPEC_ALIGN(16) _CONTEXT { +typedef struct DECLSPEC_ALIGN(16) _AMD64_CONTEXT { DWORD64 P1Home; /* 000 */ DWORD64 P2Home; /* 008 */ DWORD64 P3Home; /* 010 */ @@ -1222,35 +1228,21 @@ DWORD64 LastBranchFromRip; /* 4b8 */ DWORD64 LastExceptionToRip; /* 4c0 */ DWORD64 LastExceptionFromRip; /* 4c8 */ -} CONTEXT, *PCONTEXT; +} AMD64_CONTEXT; -typedef struct _RUNTIME_FUNCTION -{ - DWORD BeginAddress; - DWORD EndAddress; - DWORD UnwindData; -} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION; +#ifdef __x86_64__ -#define UNWIND_HISTORY_TABLE_SIZE 12 +#define CONTEXT_CONTROL CONTEXT_AMD64_CONTROL +#define CONTEXT_INTEGER CONTEXT_AMD64_INTEGER +#define CONTEXT_SEGMENTS CONTEXT_AMD64_SEGMENTS +#define CONTEXT_FLOATING_POINT CONTEXT_AMD64_FLOATING_POINT +#define CONTEXT_DEBUG_REGISTERS CONTEXT_AMD64_DEBUG_REGISTERS +#define CONTEXT_XSTATE CONTEXT_AMD64_XSTATE +#define CONTEXT_FULL CONTEXT_AMD64_FULL +#define CONTEXT_ALL CONTEXT_AMD64_ALL -typedef struct _UNWIND_HISTORY_TABLE_ENTRY -{ - ULONG64 ImageBase; - PRUNTIME_FUNCTION FunctionEntry; -} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY; - -#define UNWIND_HISTORY_TABLE_NONE 0 -#define UNWIND_HISTORY_TABLE_GLOBAL 1 -#define UNWIND_HISTORY_TABLE_LOCAL 2 - -typedef struct _UNWIND_HISTORY_TABLE -{ - ULONG Count; - UCHAR Search; - ULONG64 LowAddress; - ULONG64 HighAddress; - UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE]; -} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE; +typedef AMD64_CONTEXT CONTEXT, *PCONTEXT; +typedef AMD64_RUNTIME_FUNCTION RUNTIME_FUNCTION, *PRUNTIME_FUNCTION; typedef struct _KNONVOLATILE_CONTEXT_POINTERS { @@ -1303,31 +1295,6 @@ } DUMMYUNIONNAME2; } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS; -typedef struct _DISPATCHER_CONTEXT -{ - ULONG64 ControlPc; - ULONG64 ImageBase; - PRUNTIME_FUNCTION FunctionEntry; - ULONG64 EstablisherFrame; - ULONG64 TargetIp; - PCONTEXT ContextRecord; - PEXCEPTION_ROUTINE LanguageHandler; - PVOID HandlerData; - PUNWIND_HISTORY_TABLE HistoryTable; - DWORD ScopeIndex; - DWORD Fill0; -} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT; - -typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,PVOID); -typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,PVOID); - -NTSYSAPI PVOID WINAPI RtlVirtualUnwind(ULONG,ULONG64,ULONG64,RUNTIME_FUNCTION*,CONTEXT*,PVOID*,ULONG64*,KNONVOLATILE_CONTEXT_POINTERS*); - -#define UNW_FLAG_NHANDLER 0 -#define UNW_FLAG_EHANDLER 1 -#define UNW_FLAG_UHANDLER 2 -#define UNW_FLAG_CHAININFO 4 - #endif /* __x86_64__ */ #define XSTATE_LEGACY_FLOATING_POINT 0 @@ -1416,440 +1383,18 @@ #endif } CONTEXT_EX, *PCONTEXT_EX; -/* IA64 context definitions */ -#ifdef __ia64__ - -#define CONTEXT_IA64 0x00080000 -#define CONTEXT_CONTROL (CONTEXT_IA64 | 0x00000001) -#define CONTEXT_LOWER_FLOATING_POINT (CONTEXT_IA64 | 0x00000002) -#define CONTEXT_HIGHER_FLOATING_POINT (CONTEXT_IA64 | 0x00000004) -#define CONTEXT_INTEGER (CONTEXT_IA64 | 0x00000008) -#define CONTEXT_DEBUG (CONTEXT_IA64 | 0x00000010) -#define CONTEXT_IA32_CONTROL (CONTEXT_IA64 | 0x00000020) -#define CONTEXT_FLOATING_POINT (CONTEXT_LOWER_FLOATING_POINT | CONTEXT_HIGHER_FLOATING_POINT) -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_IA32_CONTROL) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER | CONTEXT_DEBUG | CONTEXT_IA32_CONTROL) - -#define CONTEXT_EXCEPTION_ACTIVE 0x8000000 -#define CONTEXT_SERVICE_ACTIVE 0x10000000 -#define CONTEXT_EXCEPTION_REQUEST 0x40000000 -#define CONTEXT_EXCEPTION_REPORTING 0x80000000 - -typedef struct _CONTEXT -{ - DWORD ContextFlags; - DWORD Fill1[3]; - ULONGLONG DbI0; - ULONGLONG DbI1; - ULONGLONG DbI2; - ULONGLONG DbI3; - ULONGLONG DbI4; - ULONGLONG DbI5; - ULONGLONG DbI6; - ULONGLONG DbI7; - ULONGLONG DbD0; - ULONGLONG DbD1; - ULONGLONG DbD2; - ULONGLONG DbD3; - ULONGLONG DbD4; - ULONGLONG DbD5; - ULONGLONG DbD6; - ULONGLONG DbD7; - FLOAT128 FltS0; - FLOAT128 FltS1; - FLOAT128 FltS2; - FLOAT128 FltS3; - FLOAT128 FltT0; - FLOAT128 FltT1; - FLOAT128 FltT2; - FLOAT128 FltT3; - FLOAT128 FltT4; - FLOAT128 FltT5; - FLOAT128 FltT6; - FLOAT128 FltT7; - FLOAT128 FltT8; - FLOAT128 FltT9; - FLOAT128 FltS4; - FLOAT128 FltS5; - FLOAT128 FltS6; - FLOAT128 FltS7; - FLOAT128 FltS8; - FLOAT128 FltS9; - FLOAT128 FltS10; - FLOAT128 FltS11; - FLOAT128 FltS12; - FLOAT128 FltS13; - FLOAT128 FltS14; - FLOAT128 FltS15; - FLOAT128 FltS16; - FLOAT128 FltS17; - FLOAT128 FltS18; - FLOAT128 FltS19; - FLOAT128 FltF32; - FLOAT128 FltF33; - FLOAT128 FltF34; - FLOAT128 FltF35; - FLOAT128 FltF36; - FLOAT128 FltF37; - FLOAT128 FltF38; - FLOAT128 FltF39; - FLOAT128 FltF40; - FLOAT128 FltF41; - FLOAT128 FltF42; - FLOAT128 FltF43; - FLOAT128 FltF44; - FLOAT128 FltF45; - FLOAT128 FltF46; - FLOAT128 FltF47; - FLOAT128 FltF48; - FLOAT128 FltF49; - FLOAT128 FltF50; - FLOAT128 FltF51; - FLOAT128 FltF52; - FLOAT128 FltF53; - FLOAT128 FltF54; - FLOAT128 FltF55; - FLOAT128 FltF56; - FLOAT128 FltF57; - FLOAT128 FltF58; - FLOAT128 FltF59; - FLOAT128 FltF60; - FLOAT128 FltF61; - FLOAT128 FltF62; - FLOAT128 FltF63; - FLOAT128 FltF64; - FLOAT128 FltF65; - FLOAT128 FltF66; - FLOAT128 FltF67; - FLOAT128 FltF68; - FLOAT128 FltF69; - FLOAT128 FltF70; - FLOAT128 FltF71; - FLOAT128 FltF72; - FLOAT128 FltF73; - FLOAT128 FltF74; - FLOAT128 FltF75; - FLOAT128 FltF76; - FLOAT128 FltF77; - FLOAT128 FltF78; - FLOAT128 FltF79; - FLOAT128 FltF80; - FLOAT128 FltF81; - FLOAT128 FltF82; - FLOAT128 FltF83; - FLOAT128 FltF84; - FLOAT128 FltF85; - FLOAT128 FltF86; - FLOAT128 FltF87; - FLOAT128 FltF88; - FLOAT128 FltF89; - FLOAT128 FltF90; - FLOAT128 FltF91; - FLOAT128 FltF92; - FLOAT128 FltF93; - FLOAT128 FltF94; - FLOAT128 FltF95; - FLOAT128 FltF96; - FLOAT128 FltF97; - FLOAT128 FltF98; - FLOAT128 FltF99; - FLOAT128 FltF100; - FLOAT128 FltF101; - FLOAT128 FltF102; - FLOAT128 FltF103; - FLOAT128 FltF104; - FLOAT128 FltF105; - FLOAT128 FltF106; - FLOAT128 FltF107; - FLOAT128 FltF108; - FLOAT128 FltF109; - FLOAT128 FltF110; - FLOAT128 FltF111; - FLOAT128 FltF112; - FLOAT128 FltF113; - FLOAT128 FltF114; - FLOAT128 FltF115; - FLOAT128 FltF116; - FLOAT128 FltF117; - FLOAT128 FltF118; - FLOAT128 FltF119; - FLOAT128 FltF120; - FLOAT128 FltF121; - FLOAT128 FltF122; - FLOAT128 FltF123; - FLOAT128 FltF124; - FLOAT128 FltF125; - FLOAT128 FltF126; - FLOAT128 FltF127; - ULONGLONG StFPSR; - ULONGLONG IntGp; - ULONGLONG IntT0; - ULONGLONG IntT1; - ULONGLONG IntS0; - ULONGLONG IntS1; - ULONGLONG IntS2; - ULONGLONG IntS3; - ULONGLONG IntV0; - ULONGLONG IntT2; - ULONGLONG IntT3; - ULONGLONG IntT4; - ULONGLONG IntSp; - ULONGLONG IntTeb; - ULONGLONG IntT5; - ULONGLONG IntT6; - ULONGLONG IntT7; - ULONGLONG IntT8; - ULONGLONG IntT9; - ULONGLONG IntT10; - ULONGLONG IntT11; - ULONGLONG IntT12; - ULONGLONG IntT13; - ULONGLONG IntT14; - ULONGLONG IntT15; - ULONGLONG IntT16; - ULONGLONG IntT17; - ULONGLONG IntT18; - ULONGLONG IntT19; - ULONGLONG IntT20; - ULONGLONG IntT21; - ULONGLONG IntT22; - ULONGLONG IntNats; - ULONGLONG Preds; - ULONGLONG BrRp; - ULONGLONG BrS0; - ULONGLONG BrS1; - ULONGLONG BrS2; - ULONGLONG BrS3; - ULONGLONG BrS4; - ULONGLONG BrT0; - ULONGLONG BrT1; - ULONGLONG ApUNAT; - ULONGLONG ApLC; - ULONGLONG ApEC; - ULONGLONG ApCCV; - ULONGLONG ApDCR; - ULONGLONG RsPFS; - ULONGLONG RsBSP; - ULONGLONG RsBSPSTORE; - ULONGLONG RsRSC; - ULONGLONG RsRNAT; - ULONGLONG StIPSR; - ULONGLONG StIIP; - ULONGLONG StIFS; - ULONGLONG StFCR; - ULONGLONG Eflag; - ULONGLONG SegCSD; - ULONGLONG SegSSD; - ULONGLONG Cflag; - ULONGLONG StFSR; - ULONGLONG StFIR; - ULONGLONG StFDR; - ULONGLONG UNUSEDPACK; -} CONTEXT, *PCONTEXT; - -typedef struct _RUNTIME_FUNCTION -{ - ULONG BeginAddress; - ULONG EndAddress; - ULONG UnwindInfoAddress; -} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION; - -typedef struct _FRAME_POINTERS { - ULONGLONG MemoryStackFp; - ULONGLONG BackingStoreFp; -} FRAME_POINTERS, *PFRAME_POINTERS; - -#define UNWIND_HISTORY_TABLE_SIZE 12 - -typedef struct _UNWIND_HISTORY_TABLE_ENTRY { - ULONG64 ImageBase; - ULONG64 Gp; - PRUNTIME_FUNCTION FunctionEntry; -} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY; - -typedef struct _UNWIND_HISTORY_TABLE { - ULONG Count; - UCHAR Search; - ULONG64 LowAddress; - ULONG64 HighAddress; - UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE]; -} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE; - -typedef struct _KNONVOLATILE_CONTEXT_POINTERS -{ - PFLOAT128 FltS0; - PFLOAT128 FltS1; - PFLOAT128 FltS2; - PFLOAT128 FltS3; - PFLOAT128 HighFloatingContext[10]; - PFLOAT128 FltS4; - PFLOAT128 FltS5; - PFLOAT128 FltS6; - PFLOAT128 FltS7; - PFLOAT128 FltS8; - PFLOAT128 FltS9; - PFLOAT128 FltS10; - PFLOAT128 FltS11; - PFLOAT128 FltS12; - PFLOAT128 FltS13; - PFLOAT128 FltS14; - PFLOAT128 FltS15; - PFLOAT128 FltS16; - PFLOAT128 FltS17; - PFLOAT128 FltS18; - PFLOAT128 FltS19; - PULONGLONG IntS0; - PULONGLONG IntS1; - PULONGLONG IntS2; - PULONGLONG IntS3; - PULONGLONG IntSp; - PULONGLONG IntS0Nat; - PULONGLONG IntS1Nat; - PULONGLONG IntS2Nat; - PULONGLONG IntS3Nat; - PULONGLONG IntSpNat; - PULONGLONG Preds; - PULONGLONG BrRp; - PULONGLONG BrS0; - PULONGLONG BrS1; - PULONGLONG BrS2; - PULONGLONG BrS3; - PULONGLONG BrS4; - PULONGLONG ApUNAT; - PULONGLONG ApLC; - PULONGLONG ApEC; - PULONGLONG RsPFS; - PULONGLONG StFSR; - PULONGLONG StFIR; - PULONGLONG StFDR; - PULONGLONG Cflag; -} KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS; - -NTSYSAPI ULONGLONG WINAPI RtlVirtualUnwind(ULONGLONG,ULONGLONG,RUNTIME_FUNCTION*,CONTEXT*,BOOLEAN*,FRAME_POINTERS*,KNONVOLATILE_CONTEXT_POINTERS*); - -#endif /* __ia64__ */ - -/* Alpha context definitions */ -#if defined(_ALPHA_) || defined(__ALPHA__) || defined(__alpha__) - -#define CONTEXT_ALPHA 0x00020000 - -#define CONTEXT_CONTROL (CONTEXT_ALPHA | 0x00000001) -#define CONTEXT_FLOATING_POINT (CONTEXT_ALPHA | 0x00000002) -#define CONTEXT_INTEGER (CONTEXT_ALPHA | 0x00000004) -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER) - -#define EXCEPTION_READ_FAULT 0 -#define EXCEPTION_WRITE_FAULT 1 -#define EXCEPTION_EXECUTE_FAULT 8 - -typedef struct _CONTEXT -{ - /* selected by CONTEXT_FLOATING_POINT */ - ULONGLONG FltF0; - ULONGLONG FltF1; - ULONGLONG FltF2; - ULONGLONG FltF3; - ULONGLONG FltF4; - ULONGLONG FltF5; - ULONGLONG FltF6; - ULONGLONG FltF7; - ULONGLONG FltF8; - ULONGLONG FltF9; - ULONGLONG FltF10; - ULONGLONG FltF11; - ULONGLONG FltF12; - ULONGLONG FltF13; - ULONGLONG FltF14; - ULONGLONG FltF15; - ULONGLONG FltF16; - ULONGLONG FltF17; - ULONGLONG FltF18; - ULONGLONG FltF19; - ULONGLONG FltF20; - ULONGLONG FltF21; - ULONGLONG FltF22; - ULONGLONG FltF23; - ULONGLONG FltF24; - ULONGLONG FltF25; - ULONGLONG FltF26; - ULONGLONG FltF27; - ULONGLONG FltF28; - ULONGLONG FltF29; - ULONGLONG FltF30; - ULONGLONG FltF31; - - /* selected by CONTEXT_INTEGER */ - ULONGLONG IntV0; - ULONGLONG IntT0; - ULONGLONG IntT1; - ULONGLONG IntT2; - ULONGLONG IntT3; - ULONGLONG IntT4; - ULONGLONG IntT5; - ULONGLONG IntT6; - ULONGLONG IntT7; - ULONGLONG IntS0; - ULONGLONG IntS1; - ULONGLONG IntS2; - ULONGLONG IntS3; - ULONGLONG IntS4; - ULONGLONG IntS5; - ULONGLONG IntFp; - ULONGLONG IntA0; - ULONGLONG IntA1; - ULONGLONG IntA2; - ULONGLONG IntA3; - ULONGLONG IntA4; - ULONGLONG IntA5; - ULONGLONG IntT8; - ULONGLONG IntT9; - ULONGLONG IntT10; - ULONGLONG IntT11; - ULONGLONG IntRa; - ULONGLONG IntT12; - ULONGLONG IntAt; - ULONGLONG IntGp; - ULONGLONG IntSp; - ULONGLONG IntZero; - - /* selected by CONTEXT_FLOATING_POINT */ - ULONGLONG Fpcr; - ULONGLONG SoftFpcr; - - /* selected by CONTEXT_CONTROL */ - ULONGLONG Fir; - DWORD Psr; - DWORD ContextFlags; - DWORD Fill[4]; -} CONTEXT, *PCONTEXT; - -#define _QUAD_PSR_OFFSET HighSoftFpcr -#define _QUAD_FLAGS_OFFSET HighFir - -#endif /* _ALPHA_ */ - -#ifdef __arm__ - -/* The following flags control the contents of the CONTEXT structure. */ - #define CONTEXT_ARM 0x0200000 -#define CONTEXT_CONTROL (CONTEXT_ARM | 0x00000001) -#define CONTEXT_INTEGER (CONTEXT_ARM | 0x00000002) -#define CONTEXT_FLOATING_POINT (CONTEXT_ARM | 0x00000004) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARM | 0x00000008) - -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) - -#define EXCEPTION_READ_FAULT 0 -#define EXCEPTION_WRITE_FAULT 1 -#define EXCEPTION_EXECUTE_FAULT 8 +#define CONTEXT_ARM_CONTROL (CONTEXT_ARM | 0x00000001) +#define CONTEXT_ARM_INTEGER (CONTEXT_ARM | 0x00000002) +#define CONTEXT_ARM_FLOATING_POINT (CONTEXT_ARM | 0x00000004) +#define CONTEXT_ARM_DEBUG_REGISTERS (CONTEXT_ARM | 0x00000008) +#define CONTEXT_ARM_FULL (CONTEXT_ARM_CONTROL | CONTEXT_ARM_INTEGER) +#define CONTEXT_ARM_ALL (CONTEXT_ARM_FULL | CONTEXT_ARM_FLOATING_POINT | CONTEXT_ARM_DEBUG_REGISTERS) #define ARM_MAX_BREAKPOINTS 8 #define ARM_MAX_WATCHPOINTS 1 -typedef struct _RUNTIME_FUNCTION +typedef struct _IMAGE_ARM_RUNTIME_FUNCTION { DWORD BeginAddress; union { @@ -1866,35 +1411,15 @@ DWORD StackAdjust : 10; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; -} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION; +} IMAGE_ARM_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ARM_RUNTIME_FUNCTION_ENTRY; -#define UNWIND_HISTORY_TABLE_SIZE 12 - -typedef struct _UNWIND_HISTORY_TABLE_ENTRY -{ - DWORD ImageBase; - PRUNTIME_FUNCTION FunctionEntry; -} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY; - -typedef struct _UNWIND_HISTORY_TABLE -{ - DWORD Count; - BYTE LocalHint; - BYTE GlobalHint; - BYTE Search; - BYTE Once; - DWORD LowAddress; - DWORD HighAddress; - UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE]; -} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE; - -typedef struct _NEON128 +typedef struct _ARM_NEON128 { ULONGLONG Low; LONGLONG High; -} NEON128, *PNEON128; +} ARM_NEON128; -typedef struct _CONTEXT +typedef struct _ARM_CONTEXT { ULONG ContextFlags; /* 000 */ /* CONTEXT_INTEGER */ @@ -1921,7 +1446,7 @@ ULONG Padding; /* 04c */ union { - NEON128 Q[16]; + ARM_NEON128 Q[16]; ULONGLONG D[32]; ULONG S[32]; } DUMMYUNIONNAME; /* 050 */ @@ -1931,7 +1456,20 @@ ULONG Wvr[ARM_MAX_WATCHPOINTS]; /* 190 */ ULONG Wcr[ARM_MAX_WATCHPOINTS]; /* 194 */ ULONG Padding2[2]; /* 198 */ -} CONTEXT, *PCONTEXT; +} ARM_CONTEXT; + +#ifdef __arm__ + +#define CONTEXT_CONTROL CONTEXT_ARM_CONTROL +#define CONTEXT_INTEGER CONTEXT_ARM_INTEGER +#define CONTEXT_FLOATING_POINT CONTEXT_ARM_FLOATING_POINT +#define CONTEXT_DEBUG_REGISTERS CONTEXT_ARM_DEBUG_REGISTERS +#define CONTEXT_FULL CONTEXT_ARM_FULL +#define CONTEXT_ALL CONTEXT_ARM_ALL + +typedef IMAGE_ARM_RUNTIME_FUNCTION_ENTRY RUNTIME_FUNCTION, *PRUNTIME_FUNCTION; +typedef ARM_NEON128 NEON128, *PNEON128; +typedef ARM_CONTEXT CONTEXT, *PCONTEXT; typedef struct _KNONVOLATILE_CONTEXT_POINTERS { @@ -1954,56 +1492,23 @@ PULONGLONG D15; } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS; -typedef struct _DISPATCHER_CONTEXT -{ - DWORD ControlPc; - DWORD ImageBase; - PRUNTIME_FUNCTION FunctionEntry; - DWORD EstablisherFrame; - DWORD TargetPc; - PCONTEXT ContextRecord; - PEXCEPTION_ROUTINE LanguageHandler; - PVOID HandlerData; - PUNWIND_HISTORY_TABLE HistoryTable; - DWORD ScopeIndex; - BOOLEAN ControlPcIsUnwound; - PBYTE NonVolatileRegisters; - DWORD Reserved; -} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT; - -typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,DWORD); -typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,DWORD); - -NTSYSAPI PVOID WINAPI RtlVirtualUnwind(DWORD,DWORD,DWORD,RUNTIME_FUNCTION*,CONTEXT*,PVOID*,DWORD*,KNONVOLATILE_CONTEXT_POINTERS*); - -#define UNW_FLAG_NHANDLER 0 -#define UNW_FLAG_EHANDLER 1 -#define UNW_FLAG_UHANDLER 2 - #endif /* __arm__ */ -#ifdef __aarch64__ - #define CONTEXT_ARM64 0x400000 -#define CONTEXT_CONTROL (CONTEXT_ARM64 | 0x00000001) -#define CONTEXT_INTEGER (CONTEXT_ARM64 | 0x00000002) -#define CONTEXT_FLOATING_POINT (CONTEXT_ARM64 | 0x00000004) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARM64 | 0x00000008) +#define CONTEXT_ARM64_CONTROL (CONTEXT_ARM64 | 0x00000001) +#define CONTEXT_ARM64_INTEGER (CONTEXT_ARM64 | 0x00000002) +#define CONTEXT_ARM64_FLOATING_POINT (CONTEXT_ARM64 | 0x00000004) +#define CONTEXT_ARM64_DEBUG_REGISTERS (CONTEXT_ARM64 | 0x00000008) #define CONTEXT_ARM64_X18 (CONTEXT_ARM64 | 0x00000010) +#define CONTEXT_ARM64_FULL (CONTEXT_ARM64_CONTROL | CONTEXT_ARM64_INTEGER | CONTEXT_ARM64_FLOATING_POINT) +#define CONTEXT_ARM64_ALL (CONTEXT_ARM64_FULL | CONTEXT_ARM64_DEBUG_REGISTERS | CONTEXT_ARM64_X18) #define CONTEXT_UNWOUND_TO_CALL 0x20000000 -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_ARM64_X18) - -#define EXCEPTION_READ_FAULT 0 -#define EXCEPTION_WRITE_FAULT 1 -#define EXCEPTION_EXECUTE_FAULT 8 - #define ARM64_MAX_BREAKPOINTS 8 #define ARM64_MAX_WATCHPOINTS 2 -typedef struct _RUNTIME_FUNCTION +typedef struct _IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY { DWORD BeginAddress; union @@ -2020,29 +1525,11 @@ DWORD FrameSize : 9; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; -} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION; +} IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ARM64_RUNTIME_FUNCTION_ENTRY; -#define UNWIND_HISTORY_TABLE_SIZE 12 +typedef IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY ARM64_RUNTIME_FUNCTION, *PARM64_RUNTIME_FUNCTION; -typedef struct _UNWIND_HISTORY_TABLE_ENTRY -{ - DWORD64 ImageBase; - PRUNTIME_FUNCTION FunctionEntry; -} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY; - -typedef struct _UNWIND_HISTORY_TABLE -{ - DWORD Count; - BYTE LocalHint; - BYTE GlobalHint; - BYTE Search; - BYTE Once; - DWORD64 LowAddress; - DWORD64 HighAddress; - UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE]; -} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE; - -typedef union _NEON128 +typedef union _ARM64_NT_NEON128 { struct { @@ -2053,9 +1540,9 @@ float S[4]; WORD H[8]; BYTE B[16]; -} NEON128, *PNEON128; +} ARM64_NT_NEON128, *PARM64_NT_NEON128; -typedef struct _CONTEXT +typedef struct DECLSPEC_ALIGN(16) _ARM64_NT_CONTEXT { ULONG ContextFlags; /* 000 */ /* CONTEXT_INTEGER */ @@ -2102,7 +1589,7 @@ DWORD64 Sp; /* 100 */ DWORD64 Pc; /* 108 */ /* CONTEXT_FLOATING_POINT */ - NEON128 V[32]; /* 110 */ + ARM64_NT_NEON128 V[32]; /* 110 */ DWORD Fpcr; /* 310 */ DWORD Fpsr; /* 314 */ /* CONTEXT_DEBUG_REGISTERS */ @@ -2110,7 +1597,20 @@ DWORD64 Bvr[ARM64_MAX_BREAKPOINTS]; /* 338 */ DWORD Wcr[ARM64_MAX_WATCHPOINTS]; /* 378 */ DWORD64 Wvr[ARM64_MAX_WATCHPOINTS]; /* 380 */ -} CONTEXT, *PCONTEXT; +} ARM64_NT_CONTEXT, *PARM64_NT_CONTEXT; + +#ifdef __aarch64__ + +#define CONTEXT_CONTROL CONTEXT_ARM64_CONTROL +#define CONTEXT_INTEGER CONTEXT_ARM64_INTEGER +#define CONTEXT_FLOATING_POINT CONTEXT_ARM64_FLOATING_POINT +#define CONTEXT_DEBUG_REGISTERS CONTEXT_ARM64_DEBUG_REGISTERS +#define CONTEXT_FULL CONTEXT_ARM64_FULL +#define CONTEXT_ALL CONTEXT_ARM64_ALL + +typedef IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY RUNTIME_FUNCTION, *PRUNTIME_FUNCTION; +typedef ARM64_NT_NEON128 NEON128, *PNEON128; +typedef ARM64_NT_CONTEXT CONTEXT, *PCONTEXT; typedef struct _KNONVOLATILE_CONTEXT_POINTERS { @@ -2136,266 +1636,8 @@ PDWORD64 D15; } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS; -typedef struct _DISPATCHER_CONTEXT -{ - ULONG_PTR ControlPc; - ULONG_PTR ImageBase; - PRUNTIME_FUNCTION FunctionEntry; - ULONG_PTR EstablisherFrame; - ULONG_PTR TargetPc; - PCONTEXT ContextRecord; - PEXCEPTION_ROUTINE LanguageHandler; - PVOID HandlerData; - PUNWIND_HISTORY_TABLE HistoryTable; - DWORD ScopeIndex; - BOOLEAN ControlPcIsUnwound; - PBYTE NonVolatileRegisters; -} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT; - -typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,DWORD64); -typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,DWORD64); - -NTSYSAPI PVOID WINAPI RtlVirtualUnwind(DWORD,ULONG_PTR,ULONG_PTR,RUNTIME_FUNCTION*,CONTEXT*,PVOID*,ULONG_PTR*,KNONVOLATILE_CONTEXT_POINTERS*); - -#define UNW_FLAG_NHANDLER 0 -#define UNW_FLAG_EHANDLER 1 -#define UNW_FLAG_UHANDLER 2 - #endif /* __aarch64__ */ - -/* Mips context definitions */ -#if defined(_MIPS_) || defined(__MIPS__) || defined(__mips__) - -#define CONTEXT_R4000 0x00010000 - -#define CONTEXT_CONTROL (CONTEXT_R4000 | 0x00000001) -#define CONTEXT_FLOATING_POINT (CONTEXT_R4000 | 0x00000002) -#define CONTEXT_INTEGER (CONTEXT_R4000 | 0x00000004) - -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER) - -#define EXCEPTION_READ_FAULT 0 -#define EXCEPTION_WRITE_FAULT 1 -#define EXCEPTION_EXECUTE_FAULT 8 - -typedef struct _CONTEXT -{ - DWORD Argument[4]; - /* These are selected by CONTEXT_FLOATING_POINT */ - DWORD FltF0; - DWORD FltF1; - DWORD FltF2; - DWORD FltF3; - DWORD FltF4; - DWORD FltF5; - DWORD FltF6; - DWORD FltF7; - DWORD FltF8; - DWORD FltF9; - DWORD FltF10; - DWORD FltF11; - DWORD FltF12; - DWORD FltF13; - DWORD FltF14; - DWORD FltF15; - DWORD FltF16; - DWORD FltF17; - DWORD FltF18; - DWORD FltF19; - DWORD FltF20; - DWORD FltF21; - DWORD FltF22; - DWORD FltF23; - DWORD FltF24; - DWORD FltF25; - DWORD FltF26; - DWORD FltF27; - DWORD FltF28; - DWORD FltF29; - DWORD FltF30; - DWORD FltF31; - - /* These are selected by CONTEXT_INTEGER */ - DWORD IntZero; - DWORD IntAt; - DWORD IntV0; - DWORD IntV1; - DWORD IntA0; - DWORD IntA1; - DWORD IntA2; - DWORD IntA3; - DWORD IntT0; - DWORD IntT1; - DWORD IntT2; - DWORD IntT3; - DWORD IntT4; - DWORD IntT5; - DWORD IntT6; - DWORD IntT7; - DWORD IntS0; - DWORD IntS1; - DWORD IntS2; - DWORD IntS3; - DWORD IntS4; - DWORD IntS5; - DWORD IntS6; - DWORD IntS7; - DWORD IntT8; - DWORD IntT9; - DWORD IntK0; - DWORD IntK1; - DWORD IntGp; - DWORD IntSp; - DWORD IntS8; - DWORD IntRa; - DWORD IntLo; - DWORD IntHi; - - /* These are selected by CONTEXT_FLOATING_POINT */ - DWORD Fsr; - - /* These are selected by CONTEXT_CONTROL */ - DWORD Fir; - DWORD Psr; - - DWORD ContextFlags; - DWORD Fill[2]; -} CONTEXT, *PCONTEXT; - -#endif /* _MIPS_ */ - -/* PowerPC context definitions */ -#ifdef __powerpc__ - -#define CONTEXT_CONTROL 0x0001 -#define CONTEXT_FLOATING_POINT 0x0002 -#define CONTEXT_INTEGER 0x0004 -#define CONTEXT_DEBUG_REGISTERS 0x0008 -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER) - -#define EXCEPTION_READ_FAULT 0 -#define EXCEPTION_WRITE_FAULT 1 -#define EXCEPTION_EXECUTE_FAULT 8 - -typedef struct -{ - /* These are selected by CONTEXT_FLOATING_POINT */ - double Fpr0; - double Fpr1; - double Fpr2; - double Fpr3; - double Fpr4; - double Fpr5; - double Fpr6; - double Fpr7; - double Fpr8; - double Fpr9; - double Fpr10; - double Fpr11; - double Fpr12; - double Fpr13; - double Fpr14; - double Fpr15; - double Fpr16; - double Fpr17; - double Fpr18; - double Fpr19; - double Fpr20; - double Fpr21; - double Fpr22; - double Fpr23; - double Fpr24; - double Fpr25; - double Fpr26; - double Fpr27; - double Fpr28; - double Fpr29; - double Fpr30; - double Fpr31; - double Fpscr; - - /* These are selected by CONTEXT_INTEGER */ - DWORD Gpr0; - DWORD Gpr1; - DWORD Gpr2; - DWORD Gpr3; - DWORD Gpr4; - DWORD Gpr5; - DWORD Gpr6; - DWORD Gpr7; - DWORD Gpr8; - DWORD Gpr9; - DWORD Gpr10; - DWORD Gpr11; - DWORD Gpr12; - DWORD Gpr13; - DWORD Gpr14; - DWORD Gpr15; - DWORD Gpr16; - DWORD Gpr17; - DWORD Gpr18; - DWORD Gpr19; - DWORD Gpr20; - DWORD Gpr21; - DWORD Gpr22; - DWORD Gpr23; - DWORD Gpr24; - DWORD Gpr25; - DWORD Gpr26; - DWORD Gpr27; - DWORD Gpr28; - DWORD Gpr29; - DWORD Gpr30; - DWORD Gpr31; - - DWORD Cr; - DWORD Xer; - - /* These are selected by CONTEXT_CONTROL */ - DWORD Msr; - DWORD Iar; /* Instruction Address Register , aka PC ... */ - DWORD Lr; - DWORD Ctr; - - DWORD ContextFlags; - - DWORD Dar; /* Fault registers for coredump */ - DWORD Dsisr; - DWORD Trap; /* number of powerpc exception taken */ - - /* These are selected by CONTEXT_DEBUG_REGISTERS */ - DWORD Dr0; - DWORD Dr1; - DWORD Dr2; - DWORD Dr3; - DWORD Dr4; - DWORD Dr5; - DWORD Dr6; - DWORD Dr7; -} CONTEXT, *PCONTEXT; - -typedef struct _STACK_FRAME_HEADER -{ - DWORD BackChain; - DWORD GlueSaved1; - DWORD GlueSaved2; - DWORD Reserved1; - DWORD Spare1; - DWORD Spare2; - - DWORD Parameter0; - DWORD Parameter1; - DWORD Parameter2; - DWORD Parameter3; - DWORD Parameter4; - DWORD Parameter5; - DWORD Parameter6; - DWORD Parameter7; -} STACK_FRAME_HEADER,*PSTACK_FRAME_HEADER; - -#endif /* __powerpc__ */ - #if !defined(CONTEXT_FULL) && !defined(RC_INVOKED) #error You need to define a CONTEXT for your CPU #endif @@ -2416,8 +1658,6 @@ WOW64_CONTEXT_SEGMENTS | WOW64_CONTEXT_FLOATING_POINT | \ WOW64_CONTEXT_DEBUG_REGISTERS | WOW64_CONTEXT_EXTENDED_REGISTERS) -#define WOW64_CONTEXT_XSTATE (WOW64_CONTEXT_i386 | __MSABI_LONG(0x00000040)) - #define WOW64_CONTEXT_EXCEPTION_ACTIVE 0x08000000 #define WOW64_CONTEXT_SERVICE_ACTIVE 0x10000000 #define WOW64_CONTEXT_EXCEPTION_REQUEST 0x40000000 @@ -2426,49 +1666,156 @@ #define WOW64_SIZE_OF_80387_REGISTERS 80 #define WOW64_MAXIMUM_SUPPORTED_EXTENSION 512 -typedef struct _WOW64_FLOATING_SAVE_AREA -{ - DWORD ControlWord; - DWORD StatusWord; - DWORD TagWord; - DWORD ErrorOffset; - DWORD ErrorSelector; - DWORD DataOffset; - DWORD DataSelector; - BYTE RegisterArea[WOW64_SIZE_OF_80387_REGISTERS]; - DWORD Cr0NpxState; -} WOW64_FLOATING_SAVE_AREA, *PWOW64_FLOATING_SAVE_AREA; +/* Exception definitions */ -#include "pshpack4.h" -typedef struct _WOW64_CONTEXT +#define EXCEPTION_READ_FAULT 0 +#define EXCEPTION_WRITE_FAULT 1 +#define EXCEPTION_EXECUTE_FAULT 8 + +struct _EXCEPTION_POINTERS; +struct _EXCEPTION_RECORD; + +typedef EXCEPTION_DISPOSITION WINAPI EXCEPTION_ROUTINE(struct _EXCEPTION_RECORD*,PVOID,CONTEXT*,PVOID); +typedef EXCEPTION_ROUTINE *PEXCEPTION_ROUTINE; + +#ifdef __x86_64__ + +#define UNWIND_HISTORY_TABLE_SIZE 12 + +typedef struct _UNWIND_HISTORY_TABLE_ENTRY { - DWORD ContextFlags; - DWORD Dr0; - DWORD Dr1; - DWORD Dr2; - DWORD Dr3; - DWORD Dr6; - DWORD Dr7; - WOW64_FLOATING_SAVE_AREA FloatSave; - DWORD SegGs; - DWORD SegFs; - DWORD SegEs; - DWORD SegDs; - DWORD Edi; - DWORD Esi; - DWORD Ebx; - DWORD Edx; - DWORD Ecx; - DWORD Eax; - DWORD Ebp; - DWORD Eip; - DWORD SegCs; - DWORD EFlags; - DWORD Esp; - DWORD SegSs; - BYTE ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION]; -} WOW64_CONTEXT, *PWOW64_CONTEXT; -#include "poppack.h" + ULONG64 ImageBase; + PRUNTIME_FUNCTION FunctionEntry; +} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY; + +#define UNWIND_HISTORY_TABLE_NONE 0 +#define UNWIND_HISTORY_TABLE_GLOBAL 1 +#define UNWIND_HISTORY_TABLE_LOCAL 2 + +typedef struct _UNWIND_HISTORY_TABLE +{ + ULONG Count; + UCHAR Search; + ULONG64 LowAddress; + ULONG64 HighAddress; + UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE]; +} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE; + +typedef struct _DISPATCHER_CONTEXT +{ + ULONG64 ControlPc; + ULONG64 ImageBase; + PRUNTIME_FUNCTION FunctionEntry; + ULONG64 EstablisherFrame; + ULONG64 TargetIp; + PCONTEXT ContextRecord; + PEXCEPTION_ROUTINE LanguageHandler; + PVOID HandlerData; + PUNWIND_HISTORY_TABLE HistoryTable; + DWORD ScopeIndex; + DWORD Fill0; +} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT; + +typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,PVOID); +typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,PVOID); + +#define UNW_FLAG_NHANDLER 0 +#define UNW_FLAG_EHANDLER 1 +#define UNW_FLAG_UHANDLER 2 +#define UNW_FLAG_CHAININFO 4 + +#elif defined(__arm__) + +#define UNWIND_HISTORY_TABLE_SIZE 12 + +typedef struct _UNWIND_HISTORY_TABLE_ENTRY +{ + DWORD ImageBase; + PRUNTIME_FUNCTION FunctionEntry; +} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY; + +typedef struct _UNWIND_HISTORY_TABLE +{ + DWORD Count; + BYTE LocalHint; + BYTE GlobalHint; + BYTE Search; + BYTE Once; + DWORD LowAddress; + DWORD HighAddress; + UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE]; +} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE; + +typedef struct _DISPATCHER_CONTEXT +{ + DWORD ControlPc; + DWORD ImageBase; + PRUNTIME_FUNCTION FunctionEntry; + DWORD EstablisherFrame; + DWORD TargetPc; + PCONTEXT ContextRecord; + PEXCEPTION_ROUTINE LanguageHandler; + PVOID HandlerData; + PUNWIND_HISTORY_TABLE HistoryTable; + DWORD ScopeIndex; + BOOLEAN ControlPcIsUnwound; + PBYTE NonVolatileRegisters; + DWORD Reserved; +} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT; + +typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,DWORD); +typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,DWORD); + +#define UNW_FLAG_NHANDLER 0 +#define UNW_FLAG_EHANDLER 1 +#define UNW_FLAG_UHANDLER 2 + +#elif defined(__aarch64__) + +#define UNWIND_HISTORY_TABLE_SIZE 12 + +typedef struct _UNWIND_HISTORY_TABLE_ENTRY +{ + DWORD64 ImageBase; + PRUNTIME_FUNCTION FunctionEntry; +} UNWIND_HISTORY_TABLE_ENTRY, *PUNWIND_HISTORY_TABLE_ENTRY; + +typedef struct _UNWIND_HISTORY_TABLE +{ + DWORD Count; + BYTE LocalHint; + BYTE GlobalHint; + BYTE Search; + BYTE Once; + DWORD64 LowAddress; + DWORD64 HighAddress; + UNWIND_HISTORY_TABLE_ENTRY Entry[UNWIND_HISTORY_TABLE_SIZE]; +} UNWIND_HISTORY_TABLE, *PUNWIND_HISTORY_TABLE; + +typedef struct _DISPATCHER_CONTEXT +{ + ULONG_PTR ControlPc; + ULONG_PTR ImageBase; + PRUNTIME_FUNCTION FunctionEntry; + ULONG_PTR EstablisherFrame; + ULONG_PTR TargetPc; + PCONTEXT ContextRecord; + PEXCEPTION_ROUTINE LanguageHandler; + PVOID HandlerData; + PUNWIND_HISTORY_TABLE HistoryTable; + DWORD ScopeIndex; + BOOLEAN ControlPcIsUnwound; + PBYTE NonVolatileRegisters; +} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT; + +typedef LONG (CALLBACK *PEXCEPTION_FILTER)(struct _EXCEPTION_POINTERS*,DWORD64); +typedef void (CALLBACK *PTERMINATION_HANDLER)(BOOLEAN,DWORD64); + +#define UNW_FLAG_NHANDLER 0 +#define UNW_FLAG_EHANDLER 1 +#define UNW_FLAG_UHANDLER 2 + +#endif /* __aarch64__ */ #if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) @@ -2482,6 +1829,8 @@ NTSYSAPI BOOLEAN CDECL RtlInstallFunctionTableCallback(DWORD_PTR,DWORD_PTR,DWORD,PGET_RUNTIME_FUNCTION_CALLBACK,PVOID,PCWSTR); NTSYSAPI PRUNTIME_FUNCTION WINAPI RtlLookupFunctionEntry(DWORD_PTR,DWORD_PTR*,UNWIND_HISTORY_TABLE*); NTSYSAPI void WINAPI RtlUnwindEx(PVOID,PVOID,struct _EXCEPTION_RECORD*,PVOID,CONTEXT*,UNWIND_HISTORY_TABLE*); +NTSYSAPI PVOID WINAPI RtlVirtualUnwind(DWORD,ULONG_PTR,ULONG_PTR,RUNTIME_FUNCTION*,CONTEXT*,PVOID*,ULONG_PTR*,KNONVOLATILE_CONTEXT_POINTERS*); + #endif /* @@ -6442,6 +5791,7 @@ typedef struct _COMPATIBILITY_CONTEXT_ELEMENT { GUID Id; ACTCTX_COMPATIBILITY_ELEMENT_TYPE Type; + ULONGLONG MaxVersionTested; } COMPATIBILITY_CONTEXT_ELEMENT, *PCOMPATIBILITY_CONTEXT_ELEMENT; #if !defined(__WINESRC__) && (defined(_MSC_EXTENSIONS) || ((defined(__GNUC__) && __GNUC__ >= 3))) @@ -6726,6 +6076,47 @@ } DUMMYUNIONNAME; } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX; +typedef enum _CPU_SET_INFORMATION_TYPE +{ + CpuSetInformation, +} CPU_SET_INFORMATION_TYPE, *PCPU_SET_INFORMATION_TYPE; + +typedef struct _SYSTEM_CPU_SET_INFORMATION +{ + DWORD Size; + CPU_SET_INFORMATION_TYPE Type; + union + { + struct + { + DWORD Id; + WORD Group; + BYTE LogicalProcessorIndex; + BYTE CoreIndex; + BYTE LastLevelCacheIndex; + BYTE NumaNodeIndex; + BYTE EfficiencyClass; + union + { + BYTE AllFlags; + struct + { + BYTE Parked : 1; + BYTE Allocated : 1; + BYTE AllocatedToTargetProcess : 1; + BYTE RealTime : 1; + BYTE ReservedFlags : 4; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME2; + union { + DWORD Reserved; + BYTE SchedulingClass; + }; + DWORD64 AllocationTag; + } CpuSet; + } DUMMYUNIONNAME; +} SYSTEM_CPU_SET_INFORMATION, *PSYSTEM_CPU_SET_INFORMATION; + /* Threadpool things */ typedef DWORD TP_VERSION,*PTP_VERSION;
diff --git a/mingw-w64-tools/widl/src/header.c b/mingw-w64-tools/widl/src/header.c index a5e5d6c..1a69b29 100644 --- a/mingw-w64-tools/widl/src/header.c +++ b/mingw-w64-tools/widl/src/header.c
@@ -872,11 +872,25 @@ static void write_typedef(FILE *header, type_t *type, int declonly) { - type_t *t = type_alias_get_aliasee_type(type); - if (winrt_mode && t->namespace && !is_global_namespace(t->namespace)) return; - fprintf(header, "typedef "); - write_type_v(header, type_alias_get_aliasee(type), FALSE, declonly, type->name, NAME_DEFAULT); - fprintf(header, ";\n"); + type_t *t = type_alias_get_aliasee_type(type); + if (winrt_mode && t->namespace && !is_global_namespace(t->namespace)) + { + fprintf(header, "#ifdef __cplusplus\n"); + write_namespace_start(header, t->namespace); + indent(header, 0); + } + fprintf(header, "typedef "); + write_type_v(header, type_alias_get_aliasee(type), FALSE, declonly, type->name, NAME_DEFAULT); + fprintf(header, ";\n"); + if (winrt_mode && t->namespace && !is_global_namespace(t->namespace)) + { + write_namespace_end(header, t->namespace); + fprintf(header, "#else /* __cplusplus */\n"); + fprintf(header, "typedef "); + write_type_v(header, type_alias_get_aliasee(type), FALSE, declonly, type->c_name, NAME_C); + fprintf(header, ";\n"); + fprintf(header, "#endif /* __cplusplus */\n\n"); + } } int is_const_decl(const var_t *var)
diff --git a/mingw-w64-tools/widl/src/widl.c b/mingw-w64-tools/widl/src/widl.c index 88c01a3..3f1c127 100644 --- a/mingw-w64-tools/widl/src/widl.c +++ b/mingw-w64-tools/widl/src/widl.c
@@ -212,6 +212,31 @@ { NULL, 0, NULL, 0 } }; +static const struct +{ + const char *name; + enum target_cpu cpu; +} cpu_names[] = +{ + { "i386", CPU_x86 }, + { "i486", CPU_x86 }, + { "i586", CPU_x86 }, + { "i686", CPU_x86 }, + { "i786", CPU_x86 }, + { "amd64", CPU_x86_64 }, + { "x86_64", CPU_x86_64 }, + { "powerpc", CPU_POWERPC }, + { "powerpc64", CPU_POWERPC64 }, + { "powerpc64le", CPU_POWERPC64 }, + { "arm", CPU_ARM }, + { "armv5", CPU_ARM }, + { "armv6", CPU_ARM }, + { "armv7", CPU_ARM }, + { "armv7a", CPU_ARM }, + { "arm64", CPU_ARM64 }, + { "aarch64", CPU_ARM64 }, +}; + static void rm_tempfile(void); enum stub_mode get_stub_mode(void) @@ -275,51 +300,54 @@ wpp_add_cmdline_define(version_str); } +static void set_cpu( const char *cpu, int error_out ) +{ + unsigned int i; + for (i = 0; i < ARRAY_SIZE( cpu_names ); i++) + { + if (!strcmp( cpu_names[i].name, cpu )) + { + target_cpu = cpu_names[i].cpu; + return; + } + } + if (error_out) + error( "Unrecognized CPU '%s'\n", cpu ); +} + +/* Set the target platform based on a potential prefix of the executable name. + * If not found, or not matching a known CPU name, just proceed silently. */ +static void init_argv0_target( const char *argv0 ) +{ + char *p, *name; + + if ((p = strrchr(argv0, '/')) != NULL) + argv0 = p + 1; + if ((p = strrchr(argv0, '\\')) != NULL) + argv0 = p + 1; + + name = xstrdup( argv0 ); + if (!(p = strchr(name, '-'))) + { + free( name ); + return; + } + *p = 0; + set_cpu( name, 0 ); + free( name ); +} + /* set the target platform */ static void set_target( const char *target ) { - static const struct - { - const char *name; - enum target_cpu cpu; - } cpu_names[] = - { - { "i386", CPU_x86 }, - { "i486", CPU_x86 }, - { "i586", CPU_x86 }, - { "i686", CPU_x86 }, - { "i786", CPU_x86 }, - { "amd64", CPU_x86_64 }, - { "x86_64", CPU_x86_64 }, - { "powerpc", CPU_POWERPC }, - { "powerpc64", CPU_POWERPC64 }, - { "powerpc64le", CPU_POWERPC64 }, - { "arm", CPU_ARM }, - { "armv5", CPU_ARM }, - { "armv6", CPU_ARM }, - { "armv7", CPU_ARM }, - { "armv7a", CPU_ARM }, - { "arm64", CPU_ARM64 }, - { "aarch64", CPU_ARM64 }, - }; - - unsigned int i; char *p, *spec = xstrdup( target ); /* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */ if (!(p = strchr( spec, '-' ))) error( "Invalid target specification '%s'\n", target ); *p++ = 0; - for (i = 0; i < ARRAY_SIZE( cpu_names ); i++) - { - if (!strcmp( cpu_names[i].name, spec )) - { - target_cpu = cpu_names[i].cpu; - free( spec ); - return; - } - } - error( "Unrecognized CPU '%s'\n", spec ); + set_cpu( spec, 1 ); + free( spec ); } /* clean things up when aborting on a signal */ @@ -608,6 +636,7 @@ signal( SIGHUP, exit_on_signal ); #endif init_argv0_dir( argv[0] ); + init_argv0_target( argv[0] ); now = time(NULL); @@ -790,8 +819,12 @@ if (pointer_size == 4) target_cpu = CPU_x86; else pointer_size = 8; break; + case CPU_ARM: + if (pointer_size == 8) target_cpu = CPU_ARM64; + else pointer_size = 4; + break; case CPU_ARM64: - if (pointer_size == 4) error( "Cannot build 32-bit code for this CPU\n" ); + if (pointer_size == 4) target_cpu = CPU_ARM; pointer_size = 8; break; case CPU_POWERPC64: