Commit Graph

17 Commits

Author SHA1 Message Date
Benjamin Oldenburg
2203a4407a winnt.h: add compile-time CONTEXT size assertions for fallback path
The static assertions in tccrun.c only validate CONTEXT when building
native Windows ARM64 (_WIN64 && __aarch64__). Cross-compilation builds
use the fallback definition without validation, so layout errors would
be silent.

Add matching C_ASSERT() checks after the ARM64_NT_CONTEXT definition
to catch struct layout mismatches during cross-compilation.
2026-04-04 20:02:33 +07:00
Benjamin Oldenburg
95c17cae64 winnt.h: remove dead ARM64 CONTEXT fallback code
The fallback CONTEXT definition at lines 2073-2124 was unreachable dead code.
The guard '#if defined(__aarch64__) && !defined(_ARM64_CONTEXT_DECLARED)'
could never be true because:

1. Line 50-51: __aarch64__ automatically defines _ARM64_
2. Line 1426: #if defined(_ARM64_) || defined(__aarch64__) always enters
3. Line 1473: _ARM64_CONTEXT_DECLARED is always defined inside that block
4. Line 2073: The fallback guard is therefore always false

This 52-line duplicate was a maintenance hazard that could silently diverge
from the official ARM64_NT_CONTEXT definition. Remove it entirely.
2026-04-04 20:02:32 +07:00
Benjamin Oldenburg
aa95cfad10 winnt.h: fix ARM64 CONTEXT Bvr/Wvr register types
The fallback CONTEXT struct incorrectly defined Bvr (Breakpoint Value
Registers) and Wvr (Watchpoint Value Registers) as DWORD (32-bit) instead
of DWORD64 (64-bit).

On ARM64:
- BCR/WCR (Control Registers) are 32-bit ✓
- BVR/WVR (Value Registers) are 64-bit ✓

This mismatch caused struct size and layout errors, potentially corrupting
debug register state when used with Windows debugging APIs.
2026-04-04 20:02:32 +07:00
Benjamin Oldenburg
040583cb9b winnt.h: define missing PE DLL characteristics 2026-04-04 20:02:32 +07:00
Benjamin Oldenburg
5f641e2a25 winnt.h: fix ARM64 CONTEXT struct layout mismatch
The fallback CONTEXT struct for ARM64 had multiple structural issues:
- ContextFlags was DWORD64 (8 bytes) instead of ULONG (4 bytes)
- Missing Cpsr field entirely
- Missing DECLSPEC_ALIGN(16) attribute
- X registers as simple array X[29] instead of union with named struct X[31]

These mismatches caused incorrect struct size and field offsets, leading to
register corruption when used with Windows APIs like GetThreadContext or
RtlRestoreContext.

The fallback struct now matches the official ARM64_NT_CONTEXT layout exactly,
ensuring binary compatibility with Windows ARM64 system calls.
2026-04-04 20:02:32 +07:00
Benjamin Oldenburg
4fb1e212c1 winnt.h: fix ARM64 CONTEXT V register type
The fallback CONTEXT struct for ARM64 (used when __aarch64__ is defined
but _ARM64_CONTEXT_DECLARED is not set) incorrectly defined V[32] as
DWORD64 (64-bit) instead of ARM64_NT_NEON128 (128-bit).

This caused register corruption when RtlRestoreContext restores NEON/VFP
registers, as the struct size was 256 bytes instead of the correct
512 bytes.

Fixes potential corruption on toolchains that define __aarch64__ but not
_ARM64_ (e.g., clang on macOS or certain cross-compilation scenarios).
2026-04-04 20:02:32 +07:00
Benjamin Oldenburg
396675f74f Fix Windows ARM64 runtime regressions and coverage 2026-04-04 20:02:31 +07:00
Benjamin Oldenburg
4f4b3dda6b Add and stabilize Windows ARM64 support 2026-04-04 20:02:31 +07:00
Avi Halachmi (:avih)
00b29f49a9 win32: mingw headers: mainly add LOAD_LIBRARY* values
The LOAD_LIBRARY_* constants allow safer and more controlled load.

The others in winnt.h and wincon.h are relatively minor.
2024-11-18 15:44:14 +02:00
grischka
ce1ef5b8fc some smaller fixes
- libtcc.c/tccpp.c: fix -U option for multiple input files
- libtcc: remove decl of tcc_add_crt() for PE
- tcc.h: define __i386__ and __x86_64__ for msvc
- tcc.h: undef __attribute__ for __TINYC__ on gnu/linux platforms
- tccelf.c: disable prepare_dynamic_rel unless x86/x64
- tccpe.c: construct rather than predefine PE section flags
- tccpp.c: (alt.) fix access of dead stack variable after error/longjmp
- x86_64-gen.c: fix func_alloca chain for nocode_wanted
- tccpp.c/tccgen.c: improve file:line info for inline functions
- winapi/winnt.h: correct position for DECLSPEC_ALIGN attribute
- win32/lib/crt: simplify top exception handler (needed for signal)
- arm64-gen.c: remove dprintf left from VT_CMP commit
- tccgen.c: limit binary scan with gcase to > 8 (= smaller code)
- tccgen.c: call save_regs(4) in gen_opl for cmp-ops (see test in tcctest.c)
2019-07-14 22:46:19 +02:00
Petr Skocik
47722a8c2e fix windows errors uncovered by the inline patch
By always instantiating extern inlines, the patch has discovered
2 assembly errors, which were fixed in the original mingw64 in 2009.

This fixes those errors.

Additionally it changes __CRT_INLINE in win32/include/_mingw.h
from `extern __inline__` to `static __inline__`.

__CRT_INLINE is used exclusively in header files and as such
it should not create externally visible instantiations like a `extern
inline` would (as per the C standard).
2019-06-12 15:37:59 +02:00
grischka
e596b871a9 win32: include/winapi: remove more files
Also: use _assert, older msvcrt does not have _wassert
2017-02-08 19:53:02 +01:00
Vlad Vissoultchev
5175b1ad87 Use proper ifdef for x64 check in winnt.h 2016-03-14 18:07:38 +02:00
Vlad Vissoultchev
d715ebdae0 Add x64 SEH decls. Add exports to kernel32.def 2016-03-13 04:23:15 +02:00
grischka
dc251a7d8d win64: use new headers from mingw 2009-07-18 22:06:37 +02:00
bellard
5556cf1565 dos2unix 2005-04-17 13:10:37 +00:00
bellard
4821702fb4 win32 merge 2005-04-14 23:49:21 +00:00