From 53bb00a769f3168a5663893981fccebecd7ff4d7 Mon Sep 17 00:00:00 2001 From: Leslie Zhai Date: Fri, 30 May 2025 13:57:01 +0800 Subject: [WRAPPER] Implement myStackAlignGVariantNew for g_variant_new (#2687) --- src/include/myalign.h | 3 ++- src/libtools/myalign.c | 44 +++++++++++++++++++++++++++++++++++++++++++- src/wrapped/wrappedglib2.c | 7 ++++++- tests/misc/gvariant | Bin 15704 -> 12728 bytes tests/misc/gvariant.c | 41 +++++++++++++++++++++++++++++------------ tests/misc/gvariant.txt | 6 ++++++ 6 files changed, 86 insertions(+), 15 deletions(-) diff --git a/src/include/myalign.h b/src/include/myalign.h index 54184a88..dee39253 100644 --- a/src/include/myalign.h +++ b/src/include/myalign.h @@ -181,7 +181,8 @@ void myStackAlignValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, x64_v void myStackAlignWValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, x64_va_list_t va); void myStackAlignScanfValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, x64_va_list_t va); void myStackAlignScanfWValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, x64_va_list_t va); -void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* scratch, x64_va_list_t* b); +void myStackAlignGVariantNewVa(x64emu_t* emu, const char* fmt, uint64_t* scratch, x64_va_list_t* b); +void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mystack, int xmm); #endif struct x64_stat64 { /* x86_64 arm64 */ diff --git a/src/libtools/myalign.c b/src/libtools/myalign.c index 9ef13cf5..aebfb4c7 100644 --- a/src/libtools/myalign.c +++ b/src/libtools/myalign.c @@ -1197,7 +1197,7 @@ void myStackAlignScanfWValist(x64emu_t* emu, const char* fmt, uint64_t* mystack, } } -void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* scratch, x64_va_list_t* b) +void myStackAlignGVariantNewVa(x64emu_t* emu, const char* fmt, uint64_t* scratch, x64_va_list_t* b) { uint64_t* grp = (uint64_t*)((*b)->reg_save_area); uint64_t* frp = (uint64_t*)((*b)->reg_save_area + X64_VA_MAX_REG); @@ -1239,6 +1239,48 @@ void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* scratch, } } +void myStackAlignGVariantNew(x64emu_t* emu, const char* fmt, uint64_t* st, uint64_t* mystack, int xmm) +{ + int x = 0; + int pos = 1; + const char* pfmt = fmt; + while (*pfmt) { + switch (*pfmt) { + case 'd': // double + if (xmm) { + *mystack = emu->xmm[x++].q[0]; + --xmm; + mystack++; + } else { + *mystack = *st; + st++; + mystack++; + } + break; + case 'b': + case 'y': + case 'n': + case 'q': + case 'i': + case 'h': + case 'u': + case 'x': + case 't': + if (pos < 6) + *mystack = emu->regs[regs_abi[pos++]].q[0]; + else { + *mystack = *st; + ++st; + } + ++mystack; + break; + default: + break; + } + pfmt++; + } +} + #endif #include "my_xcb_defs.h" diff --git a/src/wrapped/wrappedglib2.c b/src/wrapped/wrappedglib2.c index 7a24b5f4..d4f30fcf 100644 --- a/src/wrapped/wrappedglib2.c +++ b/src/wrapped/wrappedglib2.c @@ -1115,7 +1115,7 @@ EXPORT void* my_g_variant_new_va(x64emu_t* emu, char* fmt, void* endptr, x64_va_ #else #if defined(__loongarch64) || defined(__riscv) va_list sysv_varargs; - myStackAlignGVariantNew(emu, fmt, emu->scratch, b); + myStackAlignGVariantNewVa(emu, fmt, emu->scratch, b); sysv_varargs = (va_list)emu->scratch; #else CREATE_VALIST_FROM_VALIST(*b, emu->scratch); @@ -1126,7 +1126,12 @@ EXPORT void* my_g_variant_new_va(x64emu_t* emu, char* fmt, void* endptr, x64_va_ EXPORT void* my_g_variant_new(x64emu_t* emu, char* fmt, uint64_t* V) { +#if defined(__loongarch64) || defined(__riscv) + myStackAlignGVariantNew(emu, fmt, V, emu->scratch, R_EAX); + PREPARE_VALIST; +#else CREATE_VALIST_FROM_VAARG(V, emu->scratch, 1); +#endif return my->g_variant_new_va(fmt, NULL, &VARARGS); } diff --git a/tests/misc/gvariant b/tests/misc/gvariant index 17c33f3d..21d5d2fe 100755 Binary files a/tests/misc/gvariant and b/tests/misc/gvariant differ diff --git a/tests/misc/gvariant.c b/tests/misc/gvariant.c index 5e7df684..870dfc0d 100644 --- a/tests/misc/gvariant.c +++ b/tests/misc/gvariant.c @@ -1,14 +1,8 @@ // gcc `pkg-config --cflags glib-2.0` `pkg-config --libs glib-2.0` -O1 gvariant.c -o gvariant #include -static void func(const gchar* format, ...) +static void print(GVariant* variant) { - GVariant* variant = NULL; - va_list ap; - va_start(ap, format); - variant = g_variant_new_va(format, NULL, &ap); - va_end(ap); - if (variant != NULL) { gchar* str = g_variant_print(variant, TRUE); g_print("%s\n", str); @@ -19,13 +13,36 @@ static void func(const gchar* format, ...) } } +static void func(const gchar* format, ...) +{ + GVariant* variant = NULL; + va_list ap; + va_start(ap, format); + variant = g_variant_new_va(format, NULL, &ap); + va_end(ap); + + print(variant); +} + int main(int argc, char* argv[]) { - func("(bynqiuxthiiiiiiiiiiiiii)", FALSE, 'A', 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23); - func("(bynqiuxthdiiiiiiiiidiii)", TRUE, 'A', 3, 4, 5, 6, 7, 8, 9, 10.1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.2, 21, 22, 23); - func("(bdididxdidididididididi)", TRUE, 2.2, 3, 4.4, 5, 6.6, 7, 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18.18, 19, 20.2, 21, 22.22, 23); - func("(bdididxdididididiiiiiii)", TRUE, 2.2, 3, 4.4, 5, 6.6, 7, 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18, 19, 20, 21, 22, 23); - func("(biidiixdiiidiiidiiidiii)", TRUE, 2, 3, 4.4, 5, 6, 7, 8.8, 9, 10, 11, 12.12, 13, 14, 15, 16.16, 17, 18, 19, 20.2, 21, 22, 23); + func("(bynqiuxthiiiiiiiiiiiiii)", FALSE, 'A', 3, 4, 5, 6, G_GINT64_CONSTANT(7), G_GUINT64_CONSTANT(8), 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23); + func("(bynqiuxthdiiiiiiiiidiii)", TRUE, 'A', 3, 4, 5, 6, G_GINT64_CONSTANT(7), G_GUINT64_CONSTANT(8), 9, 10.1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.2, 21, 22, 23); + func("(bdididxdidididididididi)", TRUE, 2.2, 3, 4.4, 5, 6.6, G_GINT64_CONSTANT(7), 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18.18, 19, 20.2, 21, 22.22, 23); + func("(bdididxdididididiiiiiii)", TRUE, 2.2, 3, 4.4, 5, 6.6, G_GINT64_CONSTANT(7), 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18, 19, 20, 21, 22, 23); + func("(biidiixdiiidiiidiiidiii)", TRUE, 2, 3, 4.4, 5, 6, G_GINT64_CONSTANT(7), 8.8, 9, 10, 11, 12.12, 13, 14, 15, 16.16, 17, 18, 19, 20.2, 21, 22, 23); func("(ddddddddddddddddddddddd)", 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16, 17.17, 18.18, 19.19, 20.2, 21.21, 22.22, 23.23); + GVariant* variant = g_variant_new("(bynqiuxthiiiiiiiiiiiiii)", FALSE, 'A', 3, 4, 5, 6, G_GINT64_CONSTANT(7), G_GUINT64_CONSTANT(8), 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23); + print(variant); + variant = g_variant_new("(bynqiuxthdiiiiiiiiidiii)", TRUE, 'A', 3, 4, 5, 6, G_GINT64_CONSTANT(7), G_GUINT64_CONSTANT(8), 9, 10.1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.2, 21, 22, 23); + print(variant); + variant = g_variant_new("(bdididxdidididididididi)", TRUE, 2.2, 3, 4.4, 5, 6.6, G_GINT64_CONSTANT(7), 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18.18, 19, 20.2, 21, 22.22, 23); + print(variant); + variant = g_variant_new("(bdididxdididididiiiiiii)", TRUE, 2.2, 3, 4.4, 5, 6.6, G_GINT64_CONSTANT(7), 8.8, 9, 10.1, 11, 12.12, 13, 14.14, 15, 16.16, 17, 18, 19, 20, 21, 22, 23); + print(variant); + variant = g_variant_new("(biidiixdiiidiiidiiidiii)", TRUE, 2, 3, 4.4, 5, 6, G_GINT64_CONSTANT(7), 8.8, 9, 10, 11, 12.12, 13, 14, 15, 16.16, 17, 18, 19, 20.2, 21, 22, 23); + print(variant); + variant = g_variant_new("(ddddddddddddddddddddddd)", 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.1, 11.11, 12.12, 13.13, 14.14, 15.15, 16.16, 17.17, 18.18, 19.19, 20.2, 21.21, 22.22, 23.23); + print(variant); return 0; } diff --git a/tests/misc/gvariant.txt b/tests/misc/gvariant.txt index 6d26e8c5..686a1252 100644 --- a/tests/misc/gvariant.txt +++ b/tests/misc/gvariant.txt @@ -4,3 +4,9 @@ (true, 2.2000000000000002, 3, 4.4000000000000004, 5, 6.5999999999999996, int64 7, 8.8000000000000007, 9, 10.1, 11, 12.119999999999999, 13, 14.140000000000001, 15, 16.16, 17, 18, 19, 20, 21, 22, 23) (true, 2, 3, 4.4000000000000004, 5, 6, int64 7, 8.8000000000000007, 9, 10, 11, 12.119999999999999, 13, 14, 15, 16.16, 17, 18, 19, 20.199999999999999, 21, 22, 23) (1.1000000000000001, 2.2000000000000002, 3.2999999999999998, 4.4000000000000004, 5.5, 6.5999999999999996, 7.7000000000000002, 8.8000000000000007, 9.9000000000000004, 10.1, 11.109999999999999, 12.119999999999999, 13.130000000000001, 14.140000000000001, 15.15, 16.16, 17.170000000000002, 18.18, 19.190000000000001, 20.199999999999999, 21.210000000000001, 22.219999999999999, 23.23) +(false, byte 0x41, int16 3, uint16 4, 5, uint32 6, int64 7, uint64 8, handle 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23) +(true, byte 0x41, int16 3, uint16 4, 5, uint32 6, int64 7, uint64 8, handle 9, 10.1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.199999999999999, 21, 22, 23) +(true, 2.2000000000000002, 3, 4.4000000000000004, 5, 6.5999999999999996, int64 7, 8.8000000000000007, 9, 10.1, 11, 12.119999999999999, 13, 14.140000000000001, 15, 16.16, 17, 18.18, 19, 20.199999999999999, 21, 22.219999999999999, 23) +(true, 2.2000000000000002, 3, 4.4000000000000004, 5, 6.5999999999999996, int64 7, 8.8000000000000007, 9, 10.1, 11, 12.119999999999999, 13, 14.140000000000001, 15, 16.16, 17, 18, 19, 20, 21, 22, 23) +(true, 2, 3, 4.4000000000000004, 5, 6, int64 7, 8.8000000000000007, 9, 10, 11, 12.119999999999999, 13, 14, 15, 16.16, 17, 18, 19, 20.199999999999999, 21, 22, 23) +(1.1000000000000001, 2.2000000000000002, 3.2999999999999998, 4.4000000000000004, 5.5, 6.5999999999999996, 7.7000000000000002, 8.8000000000000007, 9.9000000000000004, 10.1, 11.109999999999999, 12.119999999999999, 13.130000000000001, 14.140000000000001, 15.15, 16.16, 17.170000000000002, 18.18, 19.190000000000001, 20.199999999999999, 21.210000000000001, 22.219999999999999, 23.23) -- cgit 1.4.1