mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 06:43:53 -06: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
8 changed files with 25 additions and 25 deletions
|
@ -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_a = (InsnData *) a;
|
||||||
InsnData *insn_b = (InsnData *) b;
|
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;
|
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_a = (InsnData *) a;
|
||||||
InsnData *insn_b = (InsnData *) b;
|
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;
|
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_a = (InsnData *) a;
|
||||||
InsnData *insn_b = (InsnData *) b;
|
InsnData *insn_b = (InsnData *) b;
|
||||||
|
@ -645,7 +645,7 @@ static void log_top_insns(void)
|
||||||
InsnData *insn;
|
InsnData *insn;
|
||||||
|
|
||||||
miss_insns = g_hash_table_get_values(miss_ht);
|
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_autoptr(GString) rep = g_string_new("");
|
||||||
g_string_append_printf(rep, "%s", "address, data misses, instruction\n");
|
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);
|
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");
|
g_string_append_printf(rep, "%s", "\naddress, fetch misses, instruction\n");
|
||||||
|
|
||||||
for (curr = miss_insns, i = 0; curr && i < limit; i++, curr = curr->next) {
|
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;
|
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");
|
g_string_append_printf(rep, "%s", "\naddress, L2 misses, instruction\n");
|
||||||
|
|
||||||
for (curr = miss_insns, i = 0; curr && i < limit; i++, curr = curr->next) {
|
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;
|
struct qemu_plugin_scoreboard *state;
|
||||||
|
|
||||||
/* SORT_HOTTEST */
|
/* SORT_HOTTEST */
|
||||||
static gint hottest(gconstpointer a, gconstpointer b)
|
static gint hottest(gconstpointer a, gconstpointer b, gpointer d)
|
||||||
{
|
{
|
||||||
NodeData *na = (NodeData *) a;
|
NodeData *na = (NodeData *) a;
|
||||||
NodeData *nb = (NodeData *) b;
|
NodeData *nb = (NodeData *) b;
|
||||||
|
@ -107,7 +107,7 @@ static gint hottest(gconstpointer a, gconstpointer b)
|
||||||
na->dest_count == nb->dest_count ? 0 : 1;
|
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 *na = (NodeData *) a;
|
||||||
NodeData *nb = (NodeData *) b;
|
NodeData *nb = (NodeData *) b;
|
||||||
|
@ -116,7 +116,7 @@ static gint exception(gconstpointer a, gconstpointer b)
|
||||||
na->early_exit == nb->early_exit ? 0 : 1;
|
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 *na = (NodeData *) a;
|
||||||
NodeData *nb = (NodeData *) b;
|
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 ");
|
g_autoptr(GString) result = g_string_new("collected ");
|
||||||
GList *data;
|
GList *data;
|
||||||
GCompareFunc sort = &hottest;
|
GCompareDataFunc sort = &hottest;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
g_mutex_lock(&node_lock);
|
g_mutex_lock(&node_lock);
|
||||||
|
@ -162,7 +162,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = g_list_sort(data, sort);
|
data = g_list_sort_with_data(data, sort, NULL);
|
||||||
|
|
||||||
for (GList *l = data;
|
for (GList *l = data;
|
||||||
l != NULL && i < topn;
|
l != NULL && i < topn;
|
||||||
|
|
|
@ -39,7 +39,7 @@ typedef struct {
|
||||||
unsigned long insns;
|
unsigned long insns;
|
||||||
} ExecCount;
|
} 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 *ea = (ExecCount *) a;
|
||||||
ExecCount *eb = (ExecCount *) b;
|
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_string_append_printf(report, "%d entries in the hash table\n",
|
||||||
g_hash_table_size(hotblocks));
|
g_hash_table_size(hotblocks));
|
||||||
counts = g_hash_table_get_values(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) {
|
if (it) {
|
||||||
g_string_append_printf(report, "pc, tcount, icount, ecount\n");
|
g_string_append_printf(report, "pc, tcount, icount, ecount\n");
|
||||||
|
|
|
@ -48,7 +48,7 @@ typedef struct {
|
||||||
static GMutex lock;
|
static GMutex lock;
|
||||||
static GHashTable *pages;
|
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 *ea = (PageCounters *) a;
|
||||||
PageCounters *eb = (PageCounters *) b;
|
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)) {
|
if (counts && g_list_next(counts)) {
|
||||||
GList *it;
|
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) {
|
for (i = 0; i < limit && it->next; i++, it = it->next) {
|
||||||
PageCounters *rec = (PageCounters *) it->data;
|
PageCounters *rec = (PageCounters *) it->data;
|
||||||
|
|
|
@ -155,7 +155,7 @@ static ClassSelector class_tables[] = {
|
||||||
static InsnClassExecCount *class_table;
|
static InsnClassExecCount *class_table;
|
||||||
static int class_table_sz;
|
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 *ea = (InsnExecCount *) a;
|
||||||
InsnExecCount *eb = (InsnExecCount *) b;
|
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);
|
counts = g_hash_table_get_values(insns);
|
||||||
if (counts && g_list_next(counts)) {
|
if (counts && g_list_next(counts)) {
|
||||||
g_string_append_printf(report, "Individual Instructions:\n");
|
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);
|
for (i = 0; i < limit && g_list_next(counts);
|
||||||
i++, counts = 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);
|
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 *ea = (DeviceCounts *) a;
|
||||||
DeviceCounts *eb = (DeviceCounts *) b;
|
DeviceCounts *eb = (DeviceCounts *) b;
|
||||||
|
@ -79,7 +79,7 @@ static gint sort_cmp(gconstpointer a, gconstpointer b)
|
||||||
eb->totals.reads + eb->totals.writes ? -1 : 1;
|
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 *ea = (IOLocationCounts *) a;
|
||||||
IOLocationCounts *eb = (IOLocationCounts *) b;
|
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)) {
|
if (counts && g_list_next(counts)) {
|
||||||
GList *it;
|
GList *it;
|
||||||
|
|
||||||
it = g_list_sort(counts, sort_cmp);
|
it = g_list_sort_with_data(counts, sort_cmp, NULL);
|
||||||
|
|
||||||
while (it) {
|
while (it) {
|
||||||
DeviceCounts *rec = (DeviceCounts *) it->data;
|
DeviceCounts *rec = (DeviceCounts *) it->data;
|
||||||
if (rec->detail) {
|
if (rec->detail) {
|
||||||
GList *accesses = g_hash_table_get_values(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";
|
const char *prefix = pattern ? "off" : "pc";
|
||||||
g_string_append_printf(report, "%s @ 0x%"PRIx64"\n",
|
g_string_append_printf(report, "%s @ 0x%"PRIx64"\n",
|
||||||
rec->name, rec->base);
|
rec->name, rec->base);
|
||||||
|
|
|
@ -67,7 +67,7 @@ static enum qemu_plugin_mem_rw rw = QEMU_PLUGIN_MEM_RW;
|
||||||
static GMutex lock;
|
static GMutex lock;
|
||||||
static GHashTable *regions;
|
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 *na = (RegionInfo *) a;
|
||||||
RegionInfo *nb = (RegionInfo *) b;
|
RegionInfo *nb = (RegionInfo *) b;
|
||||||
|
@ -94,7 +94,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||||
if (do_region_summary) {
|
if (do_region_summary) {
|
||||||
GList *counts = g_hash_table_get_values(regions);
|
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");
|
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);
|
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_a = (SyscallStats *) ea;
|
||||||
SyscallStats *ent_b = (SyscallStats *) eb;
|
SyscallStats *ent_b = (SyscallStats *) eb;
|
||||||
|
@ -197,7 +197,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||||
|
|
||||||
g_mutex_lock(&lock);
|
g_mutex_lock(&lock);
|
||||||
GList *entries = g_hash_table_get_values(statistics);
|
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");
|
qemu_plugin_outs("syscall no. calls errors\n");
|
||||||
|
|
||||||
g_list_foreach(entries, print_entry, NULL);
|
g_list_foreach(entries, print_entry, NULL);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue