|
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