mirror of
https://gitlab.com/qemu-project/qemu
synced 2025-04-29 09:22:36 +08:00
contrib/plugins: Fix type conflict of GLib function pointers
On Emscripten, function pointer casts can result in runtime failures due to strict function signature checks. This affects the use of g_list_sort and g_slist_sort, which internally perform function pointer casts that are not supported by Emscripten. To avoid these issues, g_list_sort_with_data and g_slist_sort_with_data should be used instead, as they do not rely on function pointer casting. Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <0fcddfca16ca8da2bdaa7b2c114476f5b73d032b.1745295397.git.ktokunaga.mail@gmail.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
parent
141af1b31b
commit
01499add2a
@ -576,7 +576,7 @@ static void sum_stats(void)
|
||||
}
|
||||
}
|
||||
|
||||
static int dcmp(gconstpointer a, gconstpointer b)
|
||||
static int dcmp(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
InsnData *insn_a = (InsnData *) a;
|
||||
InsnData *insn_b = (InsnData *) b;
|
||||
@ -584,7 +584,7 @@ static int dcmp(gconstpointer a, gconstpointer b)
|
||||
return insn_a->l1_dmisses < insn_b->l1_dmisses ? 1 : -1;
|
||||
}
|
||||
|
||||
static int icmp(gconstpointer a, gconstpointer b)
|
||||
static int icmp(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
InsnData *insn_a = (InsnData *) a;
|
||||
InsnData *insn_b = (InsnData *) b;
|
||||
@ -592,7 +592,7 @@ static int icmp(gconstpointer a, gconstpointer b)
|
||||
return insn_a->l1_imisses < insn_b->l1_imisses ? 1 : -1;
|
||||
}
|
||||
|
||||
static int l2_cmp(gconstpointer a, gconstpointer b)
|
||||
static int l2_cmp(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
InsnData *insn_a = (InsnData *) a;
|
||||
InsnData *insn_b = (InsnData *) b;
|
||||
@ -645,7 +645,7 @@ static void log_top_insns(void)
|
||||
InsnData *insn;
|
||||
|
||||
miss_insns = g_hash_table_get_values(miss_ht);
|
||||
miss_insns = g_list_sort(miss_insns, dcmp);
|
||||
miss_insns = g_list_sort_with_data(miss_insns, dcmp, NULL);
|
||||
g_autoptr(GString) rep = g_string_new("");
|
||||
g_string_append_printf(rep, "%s", "address, data misses, instruction\n");
|
||||
|
||||
@ -659,7 +659,7 @@ static void log_top_insns(void)
|
||||
insn->l1_dmisses, insn->disas_str);
|
||||
}
|
||||
|
||||
miss_insns = g_list_sort(miss_insns, icmp);
|
||||
miss_insns = g_list_sort_with_data(miss_insns, icmp, NULL);
|
||||
g_string_append_printf(rep, "%s", "\naddress, fetch misses, instruction\n");
|
||||
|
||||
for (curr = miss_insns, i = 0; curr && i < limit; i++, curr = curr->next) {
|
||||
@ -676,7 +676,7 @@ static void log_top_insns(void)
|
||||
goto finish;
|
||||
}
|
||||
|
||||
miss_insns = g_list_sort(miss_insns, l2_cmp);
|
||||
miss_insns = g_list_sort_with_data(miss_insns, l2_cmp, NULL);
|
||||
g_string_append_printf(rep, "%s", "\naddress, L2 misses, instruction\n");
|
||||
|
||||
for (curr = miss_insns, i = 0; curr && i < limit; i++, curr = curr->next) {
|
||||
|
@ -98,7 +98,7 @@ static GHashTable *nodes;
|
||||
struct qemu_plugin_scoreboard *state;
|
||||
|
||||
/* SORT_HOTTEST */
|
||||
static gint hottest(gconstpointer a, gconstpointer b)
|
||||
static gint hottest(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
NodeData *na = (NodeData *) a;
|
||||
NodeData *nb = (NodeData *) b;
|
||||
@ -107,7 +107,7 @@ static gint hottest(gconstpointer a, gconstpointer b)
|
||||
na->dest_count == nb->dest_count ? 0 : 1;
|
||||
}
|
||||
|
||||
static gint exception(gconstpointer a, gconstpointer b)
|
||||
static gint exception(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
NodeData *na = (NodeData *) a;
|
||||
NodeData *nb = (NodeData *) b;
|
||||
@ -116,7 +116,7 @@ static gint exception(gconstpointer a, gconstpointer b)
|
||||
na->early_exit == nb->early_exit ? 0 : 1;
|
||||
}
|
||||
|
||||
static gint popular(gconstpointer a, gconstpointer b)
|
||||
static gint popular(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
NodeData *na = (NodeData *) a;
|
||||
NodeData *nb = (NodeData *) b;
|
||||
@ -138,7 +138,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||
{
|
||||
g_autoptr(GString) result = g_string_new("collected ");
|
||||
GList *data;
|
||||
GCompareFunc sort = &hottest;
|
||||
GCompareDataFunc sort = &hottest;
|
||||
int i = 0;
|
||||
|
||||
g_mutex_lock(&node_lock);
|
||||
@ -162,7 +162,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||
break;
|
||||
}
|
||||
|
||||
data = g_list_sort(data, sort);
|
||||
data = g_list_sort_with_data(data, sort, NULL);
|
||||
|
||||
for (GList *l = data;
|
||||
l != NULL && i < topn;
|
||||
|
@ -39,7 +39,7 @@ typedef struct {
|
||||
unsigned long insns;
|
||||
} ExecCount;
|
||||
|
||||
static gint cmp_exec_count(gconstpointer a, gconstpointer b)
|
||||
static gint cmp_exec_count(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
ExecCount *ea = (ExecCount *) a;
|
||||
ExecCount *eb = (ExecCount *) b;
|
||||
@ -79,7 +79,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||
g_string_append_printf(report, "%d entries in the hash table\n",
|
||||
g_hash_table_size(hotblocks));
|
||||
counts = g_hash_table_get_values(hotblocks);
|
||||
it = g_list_sort(counts, cmp_exec_count);
|
||||
it = g_list_sort_with_data(counts, cmp_exec_count, NULL);
|
||||
|
||||
if (it) {
|
||||
g_string_append_printf(report, "pc, tcount, icount, ecount\n");
|
||||
|
@ -48,7 +48,7 @@ typedef struct {
|
||||
static GMutex lock;
|
||||
static GHashTable *pages;
|
||||
|
||||
static gint cmp_access_count(gconstpointer a, gconstpointer b)
|
||||
static gint cmp_access_count(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
PageCounters *ea = (PageCounters *) a;
|
||||
PageCounters *eb = (PageCounters *) b;
|
||||
@ -83,7 +83,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||
if (counts && g_list_next(counts)) {
|
||||
GList *it;
|
||||
|
||||
it = g_list_sort(counts, cmp_access_count);
|
||||
it = g_list_sort_with_data(counts, cmp_access_count, NULL);
|
||||
|
||||
for (i = 0; i < limit && it->next; i++, it = it->next) {
|
||||
PageCounters *rec = (PageCounters *) it->data;
|
||||
|
@ -155,7 +155,7 @@ static ClassSelector class_tables[] = {
|
||||
static InsnClassExecCount *class_table;
|
||||
static int class_table_sz;
|
||||
|
||||
static gint cmp_exec_count(gconstpointer a, gconstpointer b)
|
||||
static gint cmp_exec_count(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
InsnExecCount *ea = (InsnExecCount *) a;
|
||||
InsnExecCount *eb = (InsnExecCount *) b;
|
||||
@ -208,7 +208,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||
counts = g_hash_table_get_values(insns);
|
||||
if (counts && g_list_next(counts)) {
|
||||
g_string_append_printf(report, "Individual Instructions:\n");
|
||||
counts = g_list_sort(counts, cmp_exec_count);
|
||||
counts = g_list_sort_with_data(counts, cmp_exec_count, NULL);
|
||||
|
||||
for (i = 0; i < limit && g_list_next(counts);
|
||||
i++, counts = g_list_next(counts)) {
|
||||
|
@ -71,7 +71,7 @@ static void plugin_init(void)
|
||||
devices = g_hash_table_new(NULL, NULL);
|
||||
}
|
||||
|
||||
static gint sort_cmp(gconstpointer a, gconstpointer b)
|
||||
static gint sort_cmp(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
DeviceCounts *ea = (DeviceCounts *) a;
|
||||
DeviceCounts *eb = (DeviceCounts *) b;
|
||||
@ -79,7 +79,7 @@ static gint sort_cmp(gconstpointer a, gconstpointer b)
|
||||
eb->totals.reads + eb->totals.writes ? -1 : 1;
|
||||
}
|
||||
|
||||
static gint sort_loc(gconstpointer a, gconstpointer b)
|
||||
static gint sort_loc(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
IOLocationCounts *ea = (IOLocationCounts *) a;
|
||||
IOLocationCounts *eb = (IOLocationCounts *) b;
|
||||
@ -126,13 +126,13 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||
if (counts && g_list_next(counts)) {
|
||||
GList *it;
|
||||
|
||||
it = g_list_sort(counts, sort_cmp);
|
||||
it = g_list_sort_with_data(counts, sort_cmp, NULL);
|
||||
|
||||
while (it) {
|
||||
DeviceCounts *rec = (DeviceCounts *) it->data;
|
||||
if (rec->detail) {
|
||||
GList *accesses = g_hash_table_get_values(rec->detail);
|
||||
GList *io_it = g_list_sort(accesses, sort_loc);
|
||||
GList *io_it = g_list_sort_with_data(accesses, sort_loc, NULL);
|
||||
const char *prefix = pattern ? "off" : "pc";
|
||||
g_string_append_printf(report, "%s @ 0x%"PRIx64"\n",
|
||||
rec->name, rec->base);
|
||||
|
@ -67,7 +67,7 @@ static enum qemu_plugin_mem_rw rw = QEMU_PLUGIN_MEM_RW;
|
||||
static GMutex lock;
|
||||
static GHashTable *regions;
|
||||
|
||||
static gint addr_order(gconstpointer a, gconstpointer b)
|
||||
static gint addr_order(gconstpointer a, gconstpointer b, gpointer d)
|
||||
{
|
||||
RegionInfo *na = (RegionInfo *) a;
|
||||
RegionInfo *nb = (RegionInfo *) b;
|
||||
@ -94,7 +94,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||
if (do_region_summary) {
|
||||
GList *counts = g_hash_table_get_values(regions);
|
||||
|
||||
counts = g_list_sort(counts, addr_order);
|
||||
counts = g_list_sort_with_data(counts, addr_order, NULL);
|
||||
|
||||
g_string_printf(out, "Region Base, Reads, Writes, Seen all\n");
|
||||
|
||||
|
@ -180,7 +180,7 @@ static void print_entry(gpointer val, gpointer user_data)
|
||||
qemu_plugin_outs(out);
|
||||
}
|
||||
|
||||
static gint comp_func(gconstpointer ea, gconstpointer eb)
|
||||
static gint comp_func(gconstpointer ea, gconstpointer eb, gpointer d)
|
||||
{
|
||||
SyscallStats *ent_a = (SyscallStats *) ea;
|
||||
SyscallStats *ent_b = (SyscallStats *) eb;
|
||||
@ -197,7 +197,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||
|
||||
g_mutex_lock(&lock);
|
||||
GList *entries = g_hash_table_get_values(statistics);
|
||||
entries = g_list_sort(entries, comp_func);
|
||||
entries = g_list_sort_with_data(entries, comp_func, NULL);
|
||||
qemu_plugin_outs("syscall no. calls errors\n");
|
||||
|
||||
g_list_foreach(entries, print_entry, NULL);
|
||||
|
Loading…
x
Reference in New Issue
Block a user