diff options
author | Raed Rizqie <[email protected]> | 2024-08-10 12:58:56 +0800 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2024-08-11 00:10:28 +0900 |
commit | f1224e55fda658a7395bd3512c6aaa92cbf4a25c (patch) | |
tree | d8e8746dd1687a3d326c14b736015dec23bc8b2b /win32/win32.c | |
parent | b1f4222fc55ffa37496645a02dbe2a4f103b5d5b (diff) |
fix i386-ucrt build
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/11358
Diffstat (limited to 'win32/win32.c')
-rw-r--r-- | win32/win32.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/win32/win32.c b/win32/win32.c index afcce9f647..23ab773eec 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -2582,7 +2582,7 @@ set_pioinfo_extra(void) char *p = (char*)get_proc_address(UCRTBASE, "_isatty", NULL); /* _osfile(fh) & FDEV */ -#ifdef _M_ARM64 +#if defined(_M_ARM64) || defined(__aarch64__) #define IS_INSN(pc, name) ((*(pc) & name##_mask) == name##_id) const int max_num_inst = 500; uint32_t *start = (uint32_t*)p; @@ -2664,15 +2664,21 @@ set_pioinfo_extra(void) # else /* x86 */ /* pop ebp */ # define FUNCTION_BEFORE_RET_MARK "\x5d" + /* leave */ +# define FUNCTION_BEFORE_RET_MARK_2 "\xc9" # define FUNCTION_SKIP_BYTES 0 /* mov eax,dword ptr [eax*4+100EB430h] */ # define PIOINFO_MARK "\x8B\x04\x85" # endif if (p) { - for (pend += 10; pend < p + 300; pend++) { + for (pend += 10; pend < p + 500; pend++) { // find end of function - if (memcmp(pend, FUNCTION_BEFORE_RET_MARK, sizeof(FUNCTION_BEFORE_RET_MARK) - 1) == 0 && - (*(pend + (sizeof(FUNCTION_BEFORE_RET_MARK) - 1) + FUNCTION_SKIP_BYTES) & FUNCTION_RET) == FUNCTION_RET) { + if ((memcmp(pend, FUNCTION_BEFORE_RET_MARK, sizeof(FUNCTION_BEFORE_RET_MARK) - 1) == 0 +# ifdef FUNCTION_BEFORE_RET_MARK_2 + || memcmp(pend, FUNCTION_BEFORE_RET_MARK_2, sizeof(FUNCTION_BEFORE_RET_MARK_2) - 1) == 0 +# endif + ) && + *(pend + (sizeof(FUNCTION_BEFORE_RET_MARK) - 1) + FUNCTION_SKIP_BYTES) == (char)FUNCTION_RET) { // search backwards from end of function for (pend -= (sizeof(PIOINFO_MARK) - 1); pend > p; pend--) { if (memcmp(pend, PIOINFO_MARK, sizeof(PIOINFO_MARK) - 1) == 0) { |