|
23 | 23 | # if defined(__linux__) || defined(__sun) |
24 | 24 | # include <alloca.h> |
25 | 25 | # endif |
| 26 | +# if defined(__APPLE__) && defined(__aarch64__) |
| 27 | +# include <libkern/OSCacheControl.h> |
| 28 | +# endif |
26 | 29 | #else |
27 | 30 | # define WIN32_LEAN_AND_MEAN |
28 | 31 | # include <windows.h> |
@@ -109,6 +112,8 @@ static void ir_print_escaped_str(const char *s, size_t len, FILE *f) |
109 | 112 |
|
110 | 113 | void ir_print_const(const ir_ctx *ctx, const ir_insn *insn, FILE *f, bool quoted) |
111 | 114 | { |
| 115 | + char buf[128]; |
| 116 | + |
112 | 117 | if (insn->op == IR_FUNC || insn->op == IR_SYM) { |
113 | 118 | fprintf(f, "%s", ir_get_str(ctx, insn->val.name)); |
114 | 119 | return; |
@@ -182,14 +187,28 @@ void ir_print_const(const ir_ctx *ctx, const ir_insn *insn, FILE *f, bool quoted |
182 | 187 | if (isnan(insn->val.d)) { |
183 | 188 | fprintf(f, "nan"); |
184 | 189 | } else { |
185 | | - fprintf(f, "%g", insn->val.d); |
| 190 | + sprintf(buf, "%g", insn->val.d); |
| 191 | + if (strtod(buf, NULL) != insn->val.d) { |
| 192 | + sprintf(buf, "%.53e", insn->val.d); |
| 193 | + if (strtod(buf, NULL) != insn->val.d) { |
| 194 | + IR_ASSERT(0 && "can't format double"); |
| 195 | + } |
| 196 | + } |
| 197 | + fprintf(f, "%s", buf); |
186 | 198 | } |
187 | 199 | break; |
188 | 200 | case IR_FLOAT: |
189 | 201 | if (isnan(insn->val.f)) { |
190 | 202 | fprintf(f, "nan"); |
191 | 203 | } else { |
192 | | - fprintf(f, "%g", insn->val.f); |
| 204 | + sprintf(buf, "%g", insn->val.f); |
| 205 | + if (strtod(buf, NULL) != insn->val.f) { |
| 206 | + sprintf(buf, "%.24e", insn->val.f); |
| 207 | + if (strtod(buf, NULL) != insn->val.f) { |
| 208 | + IR_ASSERT(0 && "can't format float"); |
| 209 | + } |
| 210 | + } |
| 211 | + fprintf(f, "%s", buf); |
193 | 212 | } |
194 | 213 | break; |
195 | 214 | default: |
@@ -1556,7 +1575,11 @@ int ir_mem_flush(void *ptr, size_t size) |
1556 | 1575 | #else |
1557 | 1576 | void *ir_mem_mmap(size_t size) |
1558 | 1577 | { |
1559 | | - void *ret = mmap(NULL, size, PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); |
| 1578 | + int prot_flags = PROT_EXEC; |
| 1579 | +#if defined(__NetBSD__) |
| 1580 | + prot_flags |= PROT_MPROTECT(PROT_READ|PROT_WRITE); |
| 1581 | +#endif |
| 1582 | + void *ret = mmap(NULL, size, prot_flags, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); |
1560 | 1583 | if (ret == MAP_FAILED) { |
1561 | 1584 | ret = NULL; |
1562 | 1585 | } |
@@ -1596,6 +1619,9 @@ int ir_mem_flush(void *ptr, size_t size) |
1596 | 1619 | #if ((defined(__GNUC__) && ZEND_GCC_VERSION >= 4003) || __has_builtin(__builtin___clear_cache)) |
1597 | 1620 | __builtin___clear_cache((char*)(ptr), (char*)(ptr) + size); |
1598 | 1621 | #endif |
| 1622 | +#if defined(__APPLE__) && defined(__aarch64__) |
| 1623 | + sys_icache_invalidate(ptr, size); |
| 1624 | +#endif |
1599 | 1625 | #ifdef HAVE_VALGRIND |
1600 | 1626 | VALGRIND_DISCARD_TRANSLATIONS(ptr, size); |
1601 | 1627 | #endif |
|
0 commit comments