From 0728fa82dda6b582281ed7ab195920e47fb80d06 Mon Sep 17 00:00:00 2001 From: Wenqiang Wei Date: Mon, 11 May 2026 17:44:16 +0800 Subject: [PATCH 1/4] LATX, opt: Reduced the initial size of aot_global_info_total when loading by page, the total number of aot_global_info_total entries is typically not large, so setting the initial capacity to 512 is more appropriate. Signed-off-by: Wenqiang Wei --- target/i386/latx/sbt/aot_link_seg.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/target/i386/latx/sbt/aot_link_seg.c b/target/i386/latx/sbt/aot_link_seg.c index 4d5226ba16..86a6bb6da5 100644 --- a/target/i386/latx/sbt/aot_link_seg.c +++ b/target/i386/latx/sbt/aot_link_seg.c @@ -87,7 +87,11 @@ void try_aot_link(void) void aot_link_tree_init(void) { - aot_global_info_total = 100000; + if (option_aot & 0x2) { + aot_global_info_total = 100000; + } else { + aot_global_info_total = 128; + } aot_global_info = malloc(aot_global_info_total * sizeof(aot_link_info)); aot_global_info_index = 0; } @@ -96,7 +100,7 @@ void aot_link_tree_insert(TranslationBlock *curr, target_ulong aim1_pc, target_ulong aim2_pc) { if (aot_global_info_index >= aot_global_info_total) { - aot_global_info_total += 1000; + aot_global_info_total <<= 1; aot_global_info = realloc(aot_global_info, aot_global_info_total * sizeof(aot_link_info)); } From 0b1829cc8875fa62e3f8afc126a8c5d6f4b1b1b2 Mon Sep 17 00:00:00 2001 From: Hanlu Li Date: Fri, 24 Jul 2026 08:34:44 +0800 Subject: [PATCH 2/4] LATX, fix: Use documented AOT link capacities The page-loading path used 128 entries even though the optimization specifies an initial capacity of 512. The capacity selection also encoded the load-all mode and both sizes as magic numbers. Name the AOT mode and capacities, use 512 for page loading, and retain 100000 entries for load-all mode. Test: source consistency check verifies page=512 and segment=100000. Signed-off-by: Hanlu Li --- target/i386/latx/sbt/aot_link_seg.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/target/i386/latx/sbt/aot_link_seg.c b/target/i386/latx/sbt/aot_link_seg.c index 86a6bb6da5..ed1252854c 100644 --- a/target/i386/latx/sbt/aot_link_seg.c +++ b/target/i386/latx/sbt/aot_link_seg.c @@ -15,6 +15,12 @@ #include "accel/tcg/internal.h" #ifdef CONFIG_LATX_AOT +enum { + AOT_MODE_LOAD_ALL = 2, + AOT_LINK_PAGE_INITIAL_CAPACITY = 512, + AOT_LINK_SEGMENT_INITIAL_CAPACITY = 100000, +}; + static aot_link_info *aot_global_info; static int aot_global_info_total; static int aot_global_info_index; @@ -87,10 +93,10 @@ void try_aot_link(void) void aot_link_tree_init(void) { - if (option_aot & 0x2) { - aot_global_info_total = 100000; + if (option_aot == AOT_MODE_LOAD_ALL) { + aot_global_info_total = AOT_LINK_SEGMENT_INITIAL_CAPACITY; } else { - aot_global_info_total = 128; + aot_global_info_total = AOT_LINK_PAGE_INITIAL_CAPACITY; } aot_global_info = malloc(aot_global_info_total * sizeof(aot_link_info)); aot_global_info_index = 0; From 870c85194601c130f07fbb891721907284edb9f8 Mon Sep 17 00:00:00 2001 From: Hanlu Li Date: Fri, 24 Jul 2026 08:35:24 +0800 Subject: [PATCH 3/4] LATX, fix: Make AOT link growth overflow-safe Reducing the initial link-table capacity makes dynamic growth a normal path. The table used signed counters, shifted the capacity without an overflow guard, and assigned realloc directly back to the only pointer. Use size_t counters, typed GLib allocation, and reject capacity overflow before doubling. Test: strict checkpatch and source guard checks; LoongArch growth/build validation follows. Signed-off-by: Hanlu Li --- target/i386/latx/sbt/aot_link_seg.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/target/i386/latx/sbt/aot_link_seg.c b/target/i386/latx/sbt/aot_link_seg.c index ed1252854c..a940762c39 100644 --- a/target/i386/latx/sbt/aot_link_seg.c +++ b/target/i386/latx/sbt/aot_link_seg.c @@ -10,6 +10,7 @@ * @brief AOT optimization */ #include "aot_link_seg.h" +#include "qemu/error-report.h" #include "latx-options.h" #include "reg-map.h" #include "accel/tcg/internal.h" @@ -22,8 +23,8 @@ enum { }; static aot_link_info *aot_global_info; -static int aot_global_info_total; -static int aot_global_info_index; +static size_t aot_global_info_total; +static size_t aot_global_info_index; static void patch_jrra(aot_link_info *info) { @@ -79,7 +80,7 @@ __inline static void link_aot_tb(aot_link_info *info) void try_aot_link(void) { - for (int i = 0; i < aot_global_info_index; i++) { + for (size_t i = 0; i < aot_global_info_index; i++) { aot_link_info *info = aot_global_info + i; link_aot_tb(info); #if defined(CONFIG_LATX_JRRA) || defined(CONFIG_LATX_JRRA_STACK) @@ -98,7 +99,7 @@ void aot_link_tree_init(void) } else { aot_global_info_total = AOT_LINK_PAGE_INITIAL_CAPACITY; } - aot_global_info = malloc(aot_global_info_total * sizeof(aot_link_info)); + aot_global_info = g_new(aot_link_info, aot_global_info_total); aot_global_info_index = 0; } @@ -106,9 +107,14 @@ void aot_link_tree_insert(TranslationBlock *curr, target_ulong aim1_pc, target_ulong aim2_pc) { if (aot_global_info_index >= aot_global_info_total) { + if (aot_global_info_total > + SIZE_MAX / 2 / sizeof(*aot_global_info)) { + error_report("AOT link table capacity overflow"); + exit(EXIT_FAILURE); + } aot_global_info_total <<= 1; - aot_global_info = realloc(aot_global_info, - aot_global_info_total * sizeof(aot_link_info)); + aot_global_info = g_renew(aot_link_info, aot_global_info, + aot_global_info_total); } aot_link_info *info = aot_global_info + aot_global_info_index; info->curr = curr; From 06965c246dc431a01651ab6598784565b68c71f8 Mon Sep 17 00:00:00 2001 From: Hanlu Li Date: Fri, 24 Jul 2026 08:40:34 +0800 Subject: [PATCH 4/4] LATX, fix: Degrade gracefully on AOT link growth failure Signed-off-by: Hanlu Li --- target/i386/latx/sbt/aot_link_seg.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/target/i386/latx/sbt/aot_link_seg.c b/target/i386/latx/sbt/aot_link_seg.c index a940762c39..2ded52fc06 100644 --- a/target/i386/latx/sbt/aot_link_seg.c +++ b/target/i386/latx/sbt/aot_link_seg.c @@ -107,14 +107,24 @@ void aot_link_tree_insert(TranslationBlock *curr, target_ulong aim1_pc, target_ulong aim2_pc) { if (aot_global_info_index >= aot_global_info_total) { + size_t new_total; + aot_link_info *new_info; + if (aot_global_info_total > SIZE_MAX / 2 / sizeof(*aot_global_info)) { - error_report("AOT link table capacity overflow"); - exit(EXIT_FAILURE); + warn_report_once("AOT link table capacity overflow; " + "skipping additional AOT links"); + return; + } + new_total = aot_global_info_total << 1; + new_info = g_try_renew(aot_link_info, aot_global_info, new_total); + if (!new_info) { + warn_report_once("Could not grow AOT link table; " + "skipping additional AOT links"); + return; } - aot_global_info_total <<= 1; - aot_global_info = g_renew(aot_link_info, aot_global_info, - aot_global_info_total); + aot_global_info = new_info; + aot_global_info_total = new_total; } aot_link_info *info = aot_global_info + aot_global_info_index; info->curr = curr;