From 293f9f24c6338b5d41dd8f613aefae6be9bdbfcb Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 15 Jul 2009 22:04:38 +0000 Subject: Stored several destinations for each line when needed. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@95 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 27 +++++++++++++ src/analysis/binary.c | 7 +++- src/analysis/line-int.h | 5 ++- src/analysis/line.c | 26 ++++++++----- src/analysis/line.h | 4 +- src/editor.c | 4 +- src/graph/layout.c | 92 +++++++++++++++++---------------------------- src/gtkext/gtkbinview-int.h | 6 +-- src/gtkext/gtkbinview.c | 22 +++++------ src/gtkext/gtkbinview.h | 29 +++++++------- src/gtkext/gtkgraphview.c | 2 +- src/panel/symbols.c | 2 +- 12 files changed, 119 insertions(+), 107 deletions(-) diff --git a/ChangeLog b/ChangeLog index b6618a2..375be3e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,30 @@ +09-07-16 Cyrille Bagard + + * src/analysis/binary.c: + Remove a GCC warning and compute links for unverified conditions. + + * src/analysis/line.c: + * src/analysis/line.h: + * src/analysis/line-int.h: + Store several destinations for each line when needed. + + * src/editor.c: + Typo: GtkBinview -> GtkBinView. + + * src/graph/layout.c: + Use the new links computed in binary.c and update the code. + + * src/gtkext/gtkbinview.c: + * src/gtkext/gtkbinview.h: + * src/gtkext/gtkbinview-int.h: + Typo: GtkBinview -> GtkBinView. + + * src/gtkext/gtkgraphview.c: + Update the code. + + * src/panel/symbols.c: + Typo: GtkBinview -> GtkBinView. + 09-07-15 Cyrille Bagard * src/format/elf/helper_x86.c: diff --git a/src/analysis/binary.c b/src/analysis/binary.c index c528e96..09b7212 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -698,6 +698,9 @@ void establish_links_in_openida_binary(const openida_binary *binary) break; + case ILT_JUMP_IF_FALSE: + break; + case ILT_JUMP_IF_TRUE: target = g_rendering_line_find_by_address(binary->lines, NULL, addr); @@ -705,11 +708,11 @@ void establish_links_in_openida_binary(const openida_binary *binary) if (target != NULL) { g_rendering_line_link_with(iter, target, type); - /* + target = g_rendering_line_get_next_iter(binary->lines, iter, NULL); if (target != NULL) g_rendering_line_link_with(iter, target, ILT_JUMP_IF_FALSE); - */ + } break; diff --git a/src/analysis/line-int.h b/src/analysis/line-int.h index cf70695..4d181f9 100644 --- a/src/analysis/line-int.h +++ b/src/analysis/line-int.h @@ -54,8 +54,9 @@ struct _GRenderingLine GRenderingLine **from; /* Origines des références */ size_t from_count; /* Nombre de ces origines */ - GRenderingLine *to; /* Eventuelle ligne visée */ - InstructionLinkType link_type; /* Type de visée */ + GRenderingLine **to; /* Eventuelles lignes visées */ + InstructionLinkType *links_type; /* Type des liens de dest. */ + size_t to_count; /* Nombre de ces destinations */ PangoLayout *layout[MRD_COUNT]; /* Moteur de rendu du code/txt */ diff --git a/src/analysis/line.c b/src/analysis/line.c index 42b034a..740673a 100644 --- a/src/analysis/line.c +++ b/src/analysis/line.c @@ -295,8 +295,14 @@ void g_rendering_line_link_with(GRenderingLine *line, GRenderingLine *dest, Inst { g_rendering_line_add_link_reference(dest, line); - line->to = dest; - line->link_type = type; + line->to_count++; + + line->to = (GRenderingLine **)realloc(line->to, line->to_count * sizeof(GRenderingLine *)); + line->links_type = (InstructionLinkType *)realloc(line->links_type, line->to_count * sizeof(InstructionLinkType)); + + line->to[line->to_count - 1] = dest; + line->links_type[line->to_count - 1] = type; + } @@ -332,17 +338,18 @@ bool g_rendering_line_has_sources(const GRenderingLine *line) * * ******************************************************************************/ -bool g_rendering_line_has_destination(const GRenderingLine *line) +bool g_rendering_line_has_destinations(const GRenderingLine *line) { - return (line->to != NULL && line->link_type != ILT_CALL); + return (line->to_count > 1 || (line->to_count == 1 && line->links_type[0] != ILT_CALL)); } /****************************************************************************** * * -* Paramètres : line = ligne dont les informations sont à consulter. * -* type = type de lien présent. [OUT] * +* Paramètres : line = ligne dont les informations sont à consulter. * +* lines = liste des lignes de destination. [OUT] * +* types = liste des types de liens présents. [OUT] * * * * Description : Fournit la ligne de code de destination du lien de la ligne. * * * @@ -352,11 +359,12 @@ bool g_rendering_line_has_destination(const GRenderingLine *line) * * ******************************************************************************/ -GRenderingLine *g_rendering_line_get_destination(const GRenderingLine *line, InstructionLinkType *type) +size_t g_rendering_line_get_destinations(const GRenderingLine *line, GRenderingLine ***lines, InstructionLinkType **types) { - *type = line->link_type; + *lines = line->to; + *types = line->links_type; - return line->to; + return line->to_count; } diff --git a/src/analysis/line.h b/src/analysis/line.h index 4a293cf..5f22db2 100644 --- a/src/analysis/line.h +++ b/src/analysis/line.h @@ -97,10 +97,10 @@ void g_rendering_line_link_with(GRenderingLine *, GRenderingLine *, InstructionL bool g_rendering_line_has_sources(const GRenderingLine *); /* Indique si la ligne a une suite autre que la ligne suivante. */ -bool g_rendering_line_has_destination(const GRenderingLine *); +bool g_rendering_line_has_destinations(const GRenderingLine *); /* Fournit la ligne de code de destination du lien de la ligne. */ -GRenderingLine *g_rendering_line_get_destination(const GRenderingLine *, InstructionLinkType *); +size_t g_rendering_line_get_destinations(const GRenderingLine *, GRenderingLine ***, InstructionLinkType **); /* Procède à l'initialisation des bases d'une représentation. */ void g_rendering_line_draw(GRenderingLine *, GdkDrawable *, GdkGC *, gint, gint, gint, gint, MainRendering); diff --git a/src/editor.c b/src/editor.c index eed74fb..66187c8 100644 --- a/src/editor.c +++ b/src/editor.c @@ -770,7 +770,7 @@ void mcb_view_change_support(GtkRadioMenuItem *menuitem, GObject *ref) void mcb_view_vaddress(GtkCheckMenuItem *menuitem, gpointer data) { - GtkBinview *binview; /* Zone de code principale */ + GtkBinView *binview; /* Zone de code principale */ gboolean active; /* Etat de sélection du menu */ binview = GTK_BIN_VIEW(g_object_get_data(G_OBJECT(data), "binview")); @@ -796,7 +796,7 @@ void mcb_view_vaddress(GtkCheckMenuItem *menuitem, gpointer data) void mcb_view_code(GtkCheckMenuItem *menuitem, gpointer data) { - GtkBinview *binview; /* Zone de code principale */ + GtkBinView *binview; /* Zone de code principale */ gboolean active; /* Etat de sélection du menu */ binview = GTK_BIN_VIEW(g_object_get_data(G_OBJECT(data), "binview")); diff --git a/src/graph/layout.c b/src/graph/layout.c index 725d76c..0b4a6c6 100644 --- a/src/graph/layout.c +++ b/src/graph/layout.c @@ -127,77 +127,53 @@ static char *complete_graph_links(const GtkGraphView *view, GtkBinView **views, { size_t i; /* Boucle de parcours #1 */ GRenderingLine *last; /* Dernière ligne d'un bloc */ - GRenderingLine *dest; /* Ligne visée par une autre */ - InstructionLinkType type; /* Type de lien entre lignes */ - bool link_next; /* Lien auto. avec la suivante */ + GRenderingLine **dests; /* Ligne visée par une autre */ + InstructionLinkType *types; /* Type de lien entre lignes */ + size_t dcount; /* Nombre de liens de dest. */ + size_t j; /* Boucle de parcours #2 */ vmpa_t addr; /* Addresse de destination */ - size_t k; /* Boucle de parcours #2 */ + size_t k; /* Boucle de parcours #3 */ char buffer[LINKS_DESC_LEN]; /* Tampon pour l'ajout de liens*/ + GRenderingLine *next; /* Ligne suivante dans le flux */ for (i = 0; i < count; i++) { last = gtk_bin_view_get_last_line(views[i]); - if (g_rendering_line_has_destination(last)) + if (g_rendering_line_has_destinations(last)) { - link_next = false; + dcount = g_rendering_line_get_destinations(last, &dests, &types); - /* Premier saut : exigé par l'instruction */ - - dest = g_rendering_line_get_destination(last, &type); - - addr = get_rendering_line_address(dest); - - for (k = 0; k < count; k++) - if (gtk_bin_view_contain_address(views[k], addr)) - break; - - if (k < count) - switch (type) - { - case ILT_JUMP: - snprintf(buffer, LINKS_DESC_LEN, "_%p -> _%p;\n", views[i], views[k]); - desc = stradd(desc, buffer); - break; - - case ILT_JUMP_IF_TRUE: - snprintf(buffer, LINKS_DESC_LEN, "_%p -> _%p;\n", views[i], views[k]); - desc = stradd(desc, buffer); - link_next = true; - break; - - case ILT_JUMP_IF_FALSE: - snprintf(buffer, LINKS_DESC_LEN, "_%p -> _%p;\n", views[i], views[k]); - desc = stradd(desc, buffer); - link_next = true; - break; - - default: - break; - - } - - /* Second saut : automatique selon l'instruction */ - - if (link_next) + for (j = 0; j < dcount; j++) { - dest = g_rendering_line_get_next_iter(gtk_bin_view_get_lines(GTK_BIN_VIEW(view)), - last, - gtk_bin_view_get_last_line(GTK_BIN_VIEW(view))); - - if (dest == NULL) continue; - - addr = get_rendering_line_address(dest); + addr = get_rendering_line_address(dests[j]); for (k = 0; k < count; k++) if (gtk_bin_view_contain_address(views[k], addr)) break; if (k < count) - { - snprintf(buffer, LINKS_DESC_LEN, "_%p -> _%p;\n", views[i], views[k]); - desc = stradd(desc, buffer); - } + switch (types[j]) + { + case ILT_JUMP: + snprintf(buffer, LINKS_DESC_LEN, "_%p -> _%p;\n", views[i], views[k]); + desc = stradd(desc, buffer); + break; + + case ILT_JUMP_IF_TRUE: + snprintf(buffer, LINKS_DESC_LEN, "_%p -> _%p;\n", views[i], views[k]); + desc = stradd(desc, buffer); + break; + + case ILT_JUMP_IF_FALSE: + snprintf(buffer, LINKS_DESC_LEN, "_%p -> _%p;\n", views[i], views[k]); + desc = stradd(desc, buffer); + break; + + default: + break; + + } } @@ -206,13 +182,13 @@ static char *complete_graph_links(const GtkGraphView *view, GtkBinView **views, /* Si la ligne n'est pas la dernière, on suit le flux normal */ else if (last != gtk_bin_view_get_last_line(view)) { - dest = g_rendering_line_get_next_iter(gtk_bin_view_get_lines(GTK_BIN_VIEW(view)), + next = g_rendering_line_get_next_iter(gtk_bin_view_get_lines(GTK_BIN_VIEW(view)), last, gtk_bin_view_get_last_line(GTK_BIN_VIEW(view))); - if (dest == NULL) continue; + if (next == NULL) continue; - addr = get_rendering_line_address(dest); + addr = get_rendering_line_address(next); for (k = 0; k < count; k++) if (gtk_bin_view_contain_address(views[k], addr)) diff --git a/src/gtkext/gtkbinview-int.h b/src/gtkext/gtkbinview-int.h index 2410915..cea40a1 100644 --- a/src/gtkext/gtkbinview-int.h +++ b/src/gtkext/gtkbinview-int.h @@ -34,7 +34,7 @@ /* Définit les lignes à associer à la représentation. */ -typedef void (* set_rendering_lines_fc) (GtkBinview *, GRenderingLine *, GRenderingLine *); +typedef void (* set_rendering_lines_fc) (GtkBinView *, GRenderingLine *, GRenderingLine *); /* Réagit à la sélection externe d'une adresse. */ typedef void (* define_main_address_fc) (GtkBinView *, vmpa_t); @@ -43,7 +43,7 @@ typedef void (* define_main_address_fc) (GtkBinView *, vmpa_t); typedef bool (* get_addr_coordinates_fc) (const GtkBinView *, vmpa_t, gint *, gint *); -struct _GtkBinview +struct _GtkBinView { GtkFixed parent; /* A laisser en premier */ @@ -62,7 +62,7 @@ struct _GtkBinview }; -struct _GtkBinviewClass +struct _GtkBinViewClass { GtkFixedClass parent; /* A laisser en premier */ diff --git a/src/gtkext/gtkbinview.c b/src/gtkext/gtkbinview.c index aa231f2..f0470bc 100644 --- a/src/gtkext/gtkbinview.c +++ b/src/gtkext/gtkbinview.c @@ -40,7 +40,7 @@ static gboolean gtk_bin_view_expose(GtkBinView *, GdkEventExpose *); /* Détermine le type du composant d'affichage des morceaux. */ -G_DEFINE_TYPE(GtkBinview, gtk_binview, GTK_TYPE_FIXED) +G_DEFINE_TYPE(GtkBinView, gtk_binview, GTK_TYPE_FIXED) @@ -59,7 +59,7 @@ G_DEFINE_TYPE(GtkBinview, gtk_binview, GTK_TYPE_FIXED) * * ******************************************************************************/ -static void gtk_binview_class_init(GtkBinviewClass *class) +static void gtk_binview_class_init(GtkBinViewClass *class) { GtkWidgetClass *widget_class; /* Classe de haut niveau */ @@ -83,7 +83,7 @@ static void gtk_binview_class_init(GtkBinviewClass *class) * * ******************************************************************************/ -static void gtk_binview_init(GtkBinview *view) +static void gtk_binview_init(GtkBinView *view) { gtk_fixed_set_has_window(GTK_FIXED(view), TRUE); @@ -211,7 +211,7 @@ static gboolean gtk_bin_view_expose(GtkBinView *view, GdkEventExpose *event) * * ******************************************************************************/ -void gtk_bin_view_show_border(GtkBinview *view, bool show) +void gtk_bin_view_show_border(GtkBinView *view, bool show) { view->show_border = show; @@ -235,7 +235,7 @@ void gtk_bin_view_show_border(GtkBinview *view, bool show) * * ******************************************************************************/ -void gtk_bin_view_set_rendering_lines(GtkBinview *view, openida_binary *binary, GRenderingLine *lines, GRenderingLine *last) +void gtk_bin_view_set_rendering_lines(GtkBinView *view, openida_binary *binary, GRenderingLine *lines, GRenderingLine *last) { view->binary = binary; @@ -259,7 +259,7 @@ void gtk_bin_view_set_rendering_lines(GtkBinview *view, openida_binary *binary, * * ******************************************************************************/ -GRenderingLine *gtk_bin_view_get_lines(const GtkBinview *view) +GRenderingLine *gtk_bin_view_get_lines(const GtkBinView *view) { return view->lines; @@ -278,7 +278,7 @@ GRenderingLine *gtk_bin_view_get_lines(const GtkBinview *view) * * ******************************************************************************/ -GRenderingLine *gtk_bin_view_get_last_line(const GtkBinview *view) +GRenderingLine *gtk_bin_view_get_last_line(const GtkBinView *view) { return view->last; /* FIXME last == NULL */ @@ -309,7 +309,7 @@ GRenderingLine *gtk_bin_view_get_last_line(const GtkBinview *view) * * ******************************************************************************/ -void gtk_binview_show_vaddress(GtkBinview *binview, gboolean show) +void gtk_binview_show_vaddress(GtkBinView *binview, gboolean show) { GList *list; /* Ensemble des enfants */ GList *iter; /* Boucle de parcours */ @@ -345,7 +345,7 @@ void gtk_binview_show_vaddress(GtkBinview *binview, gboolean show) * * ******************************************************************************/ -void gtk_binview_show_code(GtkBinview *binview, gboolean show) +void gtk_binview_show_code(GtkBinView *binview, gboolean show) { GList *list; /* Ensemble des enfants */ GList *iter; /* Boucle de parcours */ @@ -378,7 +378,7 @@ void gtk_binview_show_code(GtkBinview *binview, gboolean show) * * ******************************************************************************/ -bool gtk_bin_view_contain_address(const GtkBinview *view, vmpa_t addr) +bool gtk_bin_view_contain_address(const GtkBinView *view, vmpa_t addr) { gint dummy_x; /* Abscisse pour l'appel */ gint dummy_y; /* Ordonnée pour l'appel */ @@ -401,7 +401,7 @@ bool gtk_bin_view_contain_address(const GtkBinview *view, vmpa_t addr) * * ******************************************************************************/ -void gtk_bin_view_scroll_to_address(GtkBinview *view, vmpa_t addr) +void gtk_bin_view_scroll_to_address(GtkBinView *view, vmpa_t addr) { gint x; /* Abscisse à garantir */ gint y; /* Ordonnée à garantir */ diff --git a/src/gtkext/gtkbinview.h b/src/gtkext/gtkbinview.h index 241669c..e443161 100644 --- a/src/gtkext/gtkbinview.h +++ b/src/gtkext/gtkbinview.h @@ -33,18 +33,15 @@ #define GTK_TYPE_BIN_VIEW (gtk_binview_get_type()) -#define GTK_BIN_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_BIN_VIEW, GtkBinview)) -#define GTK_BIN_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_BIN_VIEW, GtkBinviewClass)) +#define GTK_BIN_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_BIN_VIEW, GtkBinView)) +#define GTK_BIN_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_BIN_VIEW, GtkBinViewClass)) #define GTK_IS_BIN_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_BIN_VIEW)) #define GTK_IS_BIN_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_BIN_VIEW)) -#define GTK_BIN_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_BIN_VIEW, GtkBinviewClass)) +#define GTK_BIN_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_BIN_VIEW, GtkBinViewClass)) -typedef struct _GtkBinview GtkBinview; -typedef struct _GtkBinviewClass GtkBinviewClass; - -typedef struct _GtkBinview GtkBinView; -typedef struct _GtkBinviewClass GtkBinViewClass; +typedef struct _GtkBinView GtkBinView; +typedef struct _GtkBinViewClass GtkBinViewClass; @@ -55,36 +52,36 @@ GType gtk_binview_get_type(void); GtkWidget* gtk_binview_new(void); /* Définit si une bordure est à afficher. */ -void gtk_bin_view_show_border(GtkBinview *, bool); +void gtk_bin_view_show_border(GtkBinView *, bool); /* Définit les lignes à associer à la représentation. */ -void gtk_bin_view_set_rendering_lines(GtkBinview *, openida_binary *, GRenderingLine *, GRenderingLine *); +void gtk_bin_view_set_rendering_lines(GtkBinView *, openida_binary *, GRenderingLine *, GRenderingLine *); /* Fournit la liste des lignes associées à la représentation. */ -GRenderingLine *gtk_bin_view_get_lines(const GtkBinview *); +GRenderingLine *gtk_bin_view_get_lines(const GtkBinView *); /* Fournit la dernière ligne associée à la représentation. */ -GRenderingLine *gtk_bin_view_get_last_line(const GtkBinview *); +GRenderingLine *gtk_bin_view_get_last_line(const GtkBinView *); /* Choisit d'afficher les adresses virtuelles ou non. */ -void gtk_binview_show_vaddress(GtkBinview *, gboolean); +void gtk_binview_show_vaddress(GtkBinView *, gboolean); /* Choisit d'afficher le code brut ou non. */ -void gtk_binview_show_code(GtkBinview *, gboolean); +void gtk_binview_show_code(GtkBinView *, gboolean); /* Indique si la vue contient une addrese donnée. */ -bool gtk_bin_view_contain_address(const GtkBinview *, vmpa_t); +bool gtk_bin_view_contain_address(const GtkBinView *, vmpa_t); /* S'assure qu'une adresse donnée est visible à l'écran. */ -void gtk_bin_view_scroll_to_address(GtkBinview *, vmpa_t); +void gtk_bin_view_scroll_to_address(GtkBinView *, vmpa_t); diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c index 0db03f0..0332557 100644 --- a/src/gtkext/gtkgraphview.c +++ b/src/gtkext/gtkgraphview.c @@ -433,7 +433,7 @@ static GtkBinView **gtk_graph_view_load_nodes(openida_binary *binary, GRendering if (begin == NULL) begin = iter; end = iter; - if (g_rendering_line_has_destination(iter)) + if (g_rendering_line_has_destinations(iter)) { result = (GtkBinView **)realloc(result, ++(*count) * sizeof(GtkBinView *)); diff --git a/src/panel/symbols.c b/src/panel/symbols.c index 124b345..a31cc4b 100644 --- a/src/panel/symbols.c +++ b/src/panel/symbols.c @@ -128,7 +128,7 @@ void change_symbols_selection(GtkTreeSelection *selection, gpointer data) GtkTreeModel *model; gchar *string; /* Chaîne sélectionnée */ vmpa_t address; /* Adresse à rejoindre */ - GtkBinview *binview; /* Affichage à faire défiler */ + GtkBinView *binview; /* Affichage à faire défiler */ if (gtk_tree_selection_get_selected(selection, &model, &iter)) { -- cgit v0.11.2-87-g4458