mirror of
git://repo.or.cz/tinycc.git
synced 2026-06-17 15:44:18 +08:00
Move the TinyCC/Windows ARM64 Interlocked workaround from the semlock call site into the bundled WinAPI header. This keeps tcc.h using the normal Interlocked API while avoiding unresolved Interlocked imports when tcc -run self-compiles on Windows ARM64. Update lib/bt-exe.c as well so its ARM64 runtime object does not define a second InterlockedExchange fallback now provided by winnt.h.
36 lines
1.4 KiB
C
36 lines
1.4 KiB
C
#include <stdio.h>
|
|
#include <windows.h>
|
|
|
|
#define PTR(x) ((PVOID)(ULONG_PTR)(x))
|
|
#define CHECK(name, expr) printf("%s: %s\n", name, (expr) ? "yes" : "no")
|
|
|
|
int main(void)
|
|
{
|
|
PVOID volatile slot = PTR(0x1111222233334444ULL);
|
|
PVOID old;
|
|
|
|
old = InterlockedExchangePointer(&slot, PTR(0x5555666677778888ULL));
|
|
CHECK("exchange old", old == PTR(0x1111222233334444ULL));
|
|
CHECK("exchange stored", slot == PTR(0x5555666677778888ULL));
|
|
|
|
old = InterlockedCompareExchangePointer(&slot,
|
|
PTR(0x9999aaaabbbbccccULL),
|
|
PTR(0x5555666677778888ULL));
|
|
CHECK("compare old", old == PTR(0x5555666677778888ULL));
|
|
CHECK("compare stored", slot == PTR(0x9999aaaabbbbccccULL));
|
|
|
|
old = InterlockedCompareExchangePointerAcquire(&slot,
|
|
PTR(0xdddd111122223333ULL),
|
|
PTR(0x0123456789abcdefULL));
|
|
CHECK("acquire old", old == PTR(0x9999aaaabbbbccccULL));
|
|
CHECK("acquire stored", slot == PTR(0x9999aaaabbbbccccULL));
|
|
|
|
old = InterlockedCompareExchangePointerRelease(&slot,
|
|
PTR(0xdddd111122223333ULL),
|
|
PTR(0x9999aaaabbbbccccULL));
|
|
CHECK("release old", old == PTR(0x9999aaaabbbbccccULL));
|
|
CHECK("release stored", slot == PTR(0xdddd111122223333ULL));
|
|
|
|
return 0;
|
|
}
|