diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-07-12 22:47:38 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-07-12 22:47:38 (GMT) |
commit | d7f78fe9a75d96b6f3d441335dcf50a5c026d8ea (patch) | |
tree | 632744c467641825441b866c4f988c03d9c20cf1 /src/format | |
parent | bdda063b67d8c1d402f6dc17726fed0c800d3d1c (diff) |
Taken into account that raw immediate values can be used more than once.
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/preload.c | 134 | ||||
-rw-r--r-- | src/format/preload.h | 12 |
2 files changed, 140 insertions, 6 deletions
diff --git a/src/format/preload.c b/src/format/preload.c index 2eec92e..7f7a435 100644 --- a/src/format/preload.c +++ b/src/format/preload.c @@ -261,6 +261,30 @@ void g_preload_info_unlock_instructions(GPreloadInfo *info) void g_preload_info_add_instruction(GPreloadInfo *info, GArchInstruction *instr) { + g_preload_info_lock_instructions(info); + + _g_preload_info_add_instruction(info, instr); + + g_preload_info_unlock_instructions(info); + +} + + +/****************************************************************************** +* * +* Paramètres : info = instance à mettre à jour. * +* instr = instruction à venir associer. * +* * +* Description : Ajoute une instruction supplémentaire aux préchargements. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void _g_preload_info_add_instruction(GPreloadInfo *info, GArchInstruction *instr) +{ int cmp_instr_by_addr(const GArchInstruction **a, const GArchInstruction **b) { const mrange_t *range_a; /* Emplacement pour l'instr. A */ @@ -273,12 +297,46 @@ void g_preload_info_add_instruction(GPreloadInfo *info, GArchInstruction *instr) } - g_preload_info_lock_instructions(info); - insert_item_into_flat_array(&info->instructions, &instr, sizeof(GArchInstruction *), (__compar_fn_t)cmp_instr_by_addr); - g_preload_info_unlock_instructions(info); +} + + +/****************************************************************************** +* * +* Paramètres : info = instance à mettre à jour. * +* addr = localisation du commentaire recherché. * +* * +* Description : Détermine si une instruction est présente à un point donné. * +* * +* Retour : true si une instruction existe à l'emplacement indiqué. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool _g_preload_info_has_instruction_at(GPreloadInfo *info, const vmpa2t *addr) +{ + bool result; /* Bilan à retourner */ + GArchInstruction **ptr; /* Adresse dans le tableau */ + + int cmp_instr_by_addr(const vmpa2t *key, const GArchInstruction **i) + { + const mrange_t *range; /* Emplacement pour l'instr. */ + + range = g_arch_instruction_get_range(*i); + + return cmp_vmpa(key, get_mrange_addr(range)); + + } + + ptr = find_item_in_flat_array(info->instructions, sizeof(GArchInstruction *), + (__compar_fn_t)cmp_instr_by_addr, addr); + + result = (ptr != NULL); + + return result; } @@ -457,6 +515,30 @@ void g_preload_info_unlock_comments(GPreloadInfo *info) void g_preload_info_add_comment(GPreloadInfo *info, GDbComment *comment) { + g_preload_info_lock_comments(info); + + _g_preload_info_add_comment(info, comment); + + g_preload_info_unlock_comments(info); + +} + + +/****************************************************************************** +* * +* Paramètres : info = instance à mettre à jour. * +* comment = commentaire à venir associer. * +* * +* Description : Ajoute un commentaire supplémentaire aux préchargements. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void _g_preload_info_add_comment(GPreloadInfo *info, GDbComment *comment) +{ int cmp_comment_by_addr(const GDbComment * const *a, const GDbComment * const *b) { const vmpa2t *addr_a; /* Position du commentaire A */ @@ -469,12 +551,52 @@ void g_preload_info_add_comment(GPreloadInfo *info, GDbComment *comment) } - g_preload_info_lock_comments(info); - insert_item_into_flat_array(&info->comments, &comment, sizeof(GDbComment *), (__compar_fn_t)cmp_comment_by_addr); - g_preload_info_unlock_comments(info); +} + + +/****************************************************************************** +* * +* Paramètres : info = instance à mettre à consulter. * +* addr = localisation du commentaire recherché. * +* * +* Description : Recherche un commentaire dans des préchargements. * +* * +* Retour : Eventuel commenaire retrouvé ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GDbComment *_g_preload_info_find_comment_at(GPreloadInfo *info, const vmpa2t *addr) +{ + GDbComment *result; /* Trouvaille à retourner */ + GDbComment **ptr; /* Adresse dans le tableau */ + + int cmp_comment_by_addr(const vmpa2t *key, const GDbComment * const *comment) + { + const vmpa2t *caddr; /* Position du commentaire */ + + caddr = g_db_comment_get_address(*comment); + + return cmp_vmpa(key, caddr); + + } + + ptr = find_item_in_flat_array(info->comments, sizeof(GDbComment *), + (__compar_fn_t)cmp_comment_by_addr, addr); + + if (ptr != NULL) + { + result = *ptr; + g_object_ref(G_OBJECT(result)); + } + else + result = NULL; + + return result; } diff --git a/src/format/preload.h b/src/format/preload.h index 59c81b7..1e28222 100644 --- a/src/format/preload.h +++ b/src/format/preload.h @@ -66,6 +66,12 @@ void g_preload_info_unlock_instructions(GPreloadInfo *); /* Ajoute une instruction supplémentaire aux préchargements. */ void g_preload_info_add_instruction(GPreloadInfo *, GArchInstruction *); +/* Ajoute une instruction supplémentaire aux préchargements. */ +void _g_preload_info_add_instruction(GPreloadInfo *, GArchInstruction *); + +/* Détermine si une instruction est présente à un point donné. */ +bool _g_preload_info_has_instruction_at(GPreloadInfo *, const vmpa2t *); + /* Indique la quantité d'instructions préchargées disponibles. */ size_t _g_preload_info_count_instructions(const GPreloadInfo *); @@ -87,6 +93,12 @@ void g_preload_info_unlock_comments(GPreloadInfo *); /* Ajoute un commentaire supplémentaire aux préchargements. */ void g_preload_info_add_comment(GPreloadInfo *, GDbComment *); +/* Ajoute un commentaire supplémentaire aux préchargements. */ +void _g_preload_info_add_comment(GPreloadInfo *, GDbComment *); + +/* Recherche un commentaire dans des préchargements. */ +GDbComment *_g_preload_info_find_comment_at(GPreloadInfo *, const vmpa2t *); + /* Indique la quantité de commentaires préchargés disponibles. */ size_t _g_preload_info_count_comments(const GPreloadInfo *); |