diff gen_x86.h @ 2268:5b308c7b098c

Avoid code mem allocation bomb when a div instruction gets rewritten
author Michael Pavone <pavone@retrodev.com>
date Sun, 25 Dec 2022 18:16:44 -0800
parents e45a317802bd
children
line wrap: on
line diff
--- a/gen_x86.h	Sat Dec 24 20:23:05 2022 -0800
+++ b/gen_x86.h	Sun Dec 25 18:16:44 2022 -0800
@@ -218,6 +218,7 @@
 void btc_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t dst_disp, uint8_t size);
 void jcc(code_info *code, uint8_t cc, code_ptr dest);
 void jmp_rind(code_info *code, uint8_t dst);
+void jmp_nocheck(code_info *code, code_ptr dest);
 void call_noalign(code_info *code, code_ptr fun);
 void call_r(code_info *code, uint8_t dst);
 void retn(code_info *code);
@@ -225,5 +226,18 @@
 void loop(code_info *code, code_ptr dst);
 uint8_t is_mov_ir(code_ptr inst);
 
+#define ALLOC_CODE_RETRY_POINT code_info tmp_alloc_retry = *code; alloc_code_retry:
+#define ALLOC_CODE_RETRY_VAR code_info tmp_alloc_retry
+#define ALLOC_CODE_RETRY_POINT_NO_VAR tmp_alloc_retry = *code; alloc_code_retry:
+#define CHECK_BRANCH_DEST(ptr) if (code->cur - ((ptr) + 1) > 127 || code->cur - ((ptr) + 1) < -128) {\
+		code_info next_alloc_retry = *code;\
+		*code = tmp_alloc_retry;\
+		next_alloc_retry.cur = next_alloc_retry.last - (CODE_ALLOC_SIZE-RESERVE_WORDS);\
+		jmp_nocheck(code, next_alloc_retry.cur);\
+		*code = next_alloc_retry;\
+		goto alloc_code_retry;\
+	}\
+	*(ptr) = code->cur - ((ptr) + 1);
+
 #endif //GEN_X86_H_