mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-14 13:41:31 +00:00
Fix %ld specifier issue in libc-builtin printf wrapper (#1088)
The format specifiers of %ld/%lu/%li/%lx/%lp/%lo (or %z* and %t* like) should be treated as 32-bit integer in wasm. And merge the handle of unsigned/signed for %u/%d and %llu/%lld specifier when calling snprintf.
This commit is contained in:
parent
87c67eb6f0
commit
8589ed155d
|
@ -125,7 +125,6 @@ _vprintf_wa(out_func_t out, void *ctx, const char *fmt, _va_list ap,
|
||||||
int long_ctr = 0;
|
int long_ctr = 0;
|
||||||
uint8 *native_end_addr;
|
uint8 *native_end_addr;
|
||||||
const char *fmt_start_addr = NULL;
|
const char *fmt_start_addr = NULL;
|
||||||
bool is_signed;
|
|
||||||
|
|
||||||
if (!wasm_runtime_get_native_addr_range(module_inst, (uint8 *)ap, NULL,
|
if (!wasm_runtime_get_native_addr_range(module_inst, (uint8 *)ap, NULL,
|
||||||
&native_end_addr))
|
&native_end_addr))
|
||||||
|
@ -142,7 +141,6 @@ _vprintf_wa(out_func_t out, void *ctx, const char *fmt, _va_list ap,
|
||||||
might_format = 1;
|
might_format = 1;
|
||||||
long_ctr = 0;
|
long_ctr = 0;
|
||||||
fmt_start_addr = fmt;
|
fmt_start_addr = fmt;
|
||||||
is_signed = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -162,7 +160,11 @@ _vprintf_wa(out_func_t out, void *ctx, const char *fmt, _va_list ap,
|
||||||
case '7':
|
case '7':
|
||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
|
goto still_might_format;
|
||||||
|
|
||||||
case 't': /* ptrdiff_t */
|
case 't': /* ptrdiff_t */
|
||||||
|
case 'z': /* size_t (32bit on wasm) */
|
||||||
|
long_ctr = 1;
|
||||||
goto still_might_format;
|
goto still_might_format;
|
||||||
|
|
||||||
case 'j':
|
case 'j':
|
||||||
|
@ -173,7 +175,6 @@ _vprintf_wa(out_func_t out, void *ctx, const char *fmt, _va_list ap,
|
||||||
case 'l':
|
case 'l':
|
||||||
long_ctr++;
|
long_ctr++;
|
||||||
/* Fall through */
|
/* Fall through */
|
||||||
case 'z':
|
|
||||||
case 'h':
|
case 'h':
|
||||||
/* FIXME: do nothing for these modifiers */
|
/* FIXME: do nothing for these modifiers */
|
||||||
goto still_might_format;
|
goto still_might_format;
|
||||||
|
@ -181,8 +182,6 @@ _vprintf_wa(out_func_t out, void *ctx, const char *fmt, _va_list ap,
|
||||||
case 'o':
|
case 'o':
|
||||||
case 'd':
|
case 'd':
|
||||||
case 'i':
|
case 'i':
|
||||||
is_signed = true;
|
|
||||||
/* Fall through */
|
|
||||||
case 'u':
|
case 'u':
|
||||||
case 'p':
|
case 'p':
|
||||||
case 'x':
|
case 'x':
|
||||||
|
@ -193,35 +192,35 @@ _vprintf_wa(out_func_t out, void *ctx, const char *fmt, _va_list ap,
|
||||||
PREPARE_TEMP_FORMAT();
|
PREPARE_TEMP_FORMAT();
|
||||||
|
|
||||||
if (long_ctr < 2) {
|
if (long_ctr < 2) {
|
||||||
CHECK_VA_ARG(ap, uint32);
|
|
||||||
|
|
||||||
if (is_signed) {
|
|
||||||
int32 d;
|
int32 d;
|
||||||
|
|
||||||
|
CHECK_VA_ARG(ap, uint32);
|
||||||
d = _va_arg(ap, int32);
|
d = _va_arg(ap, int32);
|
||||||
|
|
||||||
|
if (long_ctr == 1) {
|
||||||
|
uint32 fmt_end_idx = fmt - fmt_start_addr;
|
||||||
|
|
||||||
|
if (fmt_buf[fmt_end_idx - 1] == 'l'
|
||||||
|
|| fmt_buf[fmt_end_idx - 1] == 'z'
|
||||||
|
|| fmt_buf[fmt_end_idx - 1] == 't') {
|
||||||
|
/* The %ld, %zd and %td should be treated as
|
||||||
|
* 32bit integer in wasm */
|
||||||
|
fmt_buf[fmt_end_idx - 1] = fmt_buf[fmt_end_idx];
|
||||||
|
fmt_buf[fmt_end_idx] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
n = snprintf(buf, sizeof(buf), fmt_buf, d);
|
n = snprintf(buf, sizeof(buf), fmt_buf, d);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
uint32 u;
|
int64 lld;
|
||||||
u = _va_arg(ap, uint32);
|
|
||||||
n = snprintf(buf, sizeof(buf), fmt_buf, u);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* Make 8-byte aligned */
|
/* Make 8-byte aligned */
|
||||||
ap = (_va_list)(((uintptr_t)ap + 7) & ~(uintptr_t)7);
|
ap = (_va_list)(((uintptr_t)ap + 7) & ~(uintptr_t)7);
|
||||||
CHECK_VA_ARG(ap, uint64);
|
CHECK_VA_ARG(ap, uint64);
|
||||||
|
|
||||||
if (is_signed) {
|
|
||||||
int64 lld;
|
|
||||||
lld = _va_arg(ap, int64);
|
lld = _va_arg(ap, int64);
|
||||||
n = snprintf(buf, sizeof(buf), fmt_buf, lld);
|
n = snprintf(buf, sizeof(buf), fmt_buf, lld);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
uint64 llu;
|
|
||||||
llu = _va_arg(ap, uint64);
|
|
||||||
n = snprintf(buf, sizeof(buf), fmt_buf, llu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
OUTPUT_TEMP_FORMAT();
|
OUTPUT_TEMP_FORMAT();
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user