From b94be85e00d7770af4de93bbba91b421cfb6faea Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 15 Mar 2016 01:01:58 +0100 Subject: Marked lines which are able to start a group of lines as width managers. --- ChangeLog | 15 +++++++++++ plugins/readdex/class.c | 9 +++++++ plugins/readdex/code.c | 8 ++++++ plugins/readdex/header.c | 2 ++ plugins/readdex/ids.c | 16 +++++++++++- src/analysis/disass/output.c | 17 ++---------- src/format/symbol.c | 61 ++++++++++++++++++++++++++++++++++++++++++++ src/format/symbol.h | 6 +++++ 8 files changed, 118 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 01893ee..8c8ee30 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +16-03-15 Cyrille Bagard + + * plugins/readdex/class.c: + * plugins/readdex/code.c: + * plugins/readdex/header.c: + * plugins/readdex/ids.c: + Update code. + + * src/analysis/disass/output.c: + Mark lines which are able to start a group of lines as width managers. + + * src/format/symbol.c: + * src/format/symbol.h: + Mark symbols as able to start a group of lines. + 16-03-14 Cyrille Bagard * plugins/readelf/header.c: diff --git a/plugins/readdex/class.c b/plugins/readdex/class.c index 3f0608a..ccfdf9d 100644 --- a/plugins/readdex/class.c +++ b/plugins/readdex/class.c @@ -105,6 +105,9 @@ bool annotate_dex_class_defs(const GDexFormat *format) free(text); + if (i == 0) + g_binary_symbol_define_as_block_start(symbol, true); + /* access_flags */ copy_vmpa(&start, &pos); @@ -261,6 +264,8 @@ static bool annotate_dex_class_data(const GDexFormat *format, const GDexClass *c free(text); + g_binary_symbol_define_as_block_start(symbol, true); + /* instance_fields_size */ copy_vmpa(&start, &pos); @@ -365,6 +370,8 @@ static bool annotate_dex_encoded_field(const GDexFormat *format, vmpa2t *pos) free(text); + g_binary_symbol_define_as_block_start(symbol, true); + /* access_flags */ copy_vmpa(&start, pos); @@ -427,6 +434,8 @@ static bool annotate_dex_encoded_method(const GDexFormat *format, const encoded_ free(text); + g_binary_symbol_define_as_block_start(symbol, true); + /* access_flags */ copy_vmpa(&start, pos); diff --git a/plugins/readdex/code.c b/plugins/readdex/code.c index 971117e..24813ea 100644 --- a/plugins/readdex/code.c +++ b/plugins/readdex/code.c @@ -99,6 +99,8 @@ bool annotate_dex_code_item(const GDexFormat *format, uleb128_t offset) free(text); + g_binary_symbol_define_as_block_start(symbol, true); + /* ins_size */ copy_vmpa(&start, &pos); @@ -253,6 +255,8 @@ static bool annotate_dex_try_item(const GDexFormat *format, vmpa2t *pos, const v free(text); + g_binary_symbol_define_as_block_start(symbol, true); + /* insn_count */ copy_vmpa(&start, pos); @@ -336,6 +340,8 @@ static bool annotate_dex_encoded_catch_handler_list(const GDexFormat *format, vm free(text); + g_binary_symbol_define_as_block_start(symbol, true); + /* instance_fields_size */ g_imm_operand_as_uleb128(G_IMM_OPERAND(operand), &size); @@ -396,6 +402,8 @@ static bool annotate_dex_encoded_catch_handler(const GDexFormat *format, vmpa2t free(text); + g_binary_symbol_define_as_block_start(symbol, true); + g_imm_operand_as_leb128(G_IMM_OPERAND(operand), &size); has_catch_all = (size <= 0); diff --git a/plugins/readdex/header.c b/plugins/readdex/header.c index 183ca82..999baa4 100644 --- a/plugins/readdex/header.c +++ b/plugins/readdex/header.c @@ -82,6 +82,8 @@ bool annotate_dex_header(GDexFormat *format) ADD_RAW_AS_SYM(format, symbol, &start, instr, comment, _("DEX magic number")); + g_binary_symbol_define_as_block_start(symbol, true); + /* checksum */ copy_vmpa(&start, &pos); diff --git a/plugins/readdex/ids.c b/plugins/readdex/ids.c index 54d0bd7..c9f1cb5 100644 --- a/plugins/readdex/ids.c +++ b/plugins/readdex/ids.c @@ -89,6 +89,9 @@ bool annotate_dex_string_ids(const GDexFormat *format) free(text); + if (i == 0) + g_binary_symbol_define_as_block_start(symbol, true); + /* Description de la chaîne : taille */ operand = g_arch_instruction_get_operand(instr, 0); @@ -178,6 +181,9 @@ bool annotate_dex_type_ids(const GDexFormat *format) free(text); + if (i == 0) + g_binary_symbol_define_as_block_start(symbol, true); + } g_object_unref(G_OBJECT(content)); @@ -236,6 +242,9 @@ bool annotate_dex_proto_ids(const GDexFormat *format) free(text); + if (i == 0) + g_binary_symbol_define_as_block_start(symbol, true); + /* return_type_idx */ copy_vmpa(&start, &pos); @@ -320,6 +329,9 @@ bool annotate_dex_field_ids(const GDexFormat *format) free(text); + if (i == 0) + g_binary_symbol_define_as_block_start(symbol, true); + /* type_idx */ copy_vmpa(&start, &pos); @@ -404,6 +416,9 @@ bool annotate_dex_method_ids(const GDexFormat *format) free(text); + if (i == 0) + g_binary_symbol_define_as_block_start(symbol, true); + /* proto_idx */ copy_vmpa(&start, &pos); @@ -437,4 +452,3 @@ bool annotate_dex_method_ids(const GDexFormat *format) return true; } - diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c index 07165c0..51b0a04 100644 --- a/src/analysis/disass/output.c +++ b/src/analysis/disass/output.c @@ -246,21 +246,8 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form /* Début d'un groupe bien cohérent avec les alignements ? */ - switch (g_binary_symbol_get_target_type(symbols[sym_index])) - { - case STP_ROUTINE: - case STP_OBJECT: - case STP_FUNCTION: - case STP_ENTRY_POINT: - case STP_STRING: - case STP_RO_STRING: - g_buffer_line_add_flag(line, BLF_WIDTH_MANAGER); - break; - - default: - break; - - } + if (g_binary_symbol_is_block_start(symbols[sym_index])) + g_buffer_line_add_flag(line, BLF_WIDTH_MANAGER); /* Commentaire ? */ diff --git a/src/format/symbol.c b/src/format/symbol.c index 58fdfb3..2c2e5ad 100644 --- a/src/format/symbol.c +++ b/src/format/symbol.c @@ -36,6 +36,7 @@ struct _GBinSymbol SymbolType type; /* Type du symbole */ + bool block_start; /* Début d'un bloc ? */ char *alt; /* Nom alternatif */ union @@ -244,6 +245,66 @@ SymbolType g_binary_symbol_get_target_type(const GBinSymbol *symbol) /****************************************************************************** * * +* Paramètres : symbol = symbole à venir compléter. * +* start = indication quant à la nature du symbole. * +* * +* Description : Définit si un symbole est susceptible de démarrer un bloc. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_binary_symbol_define_as_block_start(GBinSymbol *symbol, bool start) +{ + symbol->block_start = start; + +} + + +/****************************************************************************** +* * +* Paramètres : symbol = symbole à venir consulter. * +* * +* Description : Indique si un symbole est susceptible de démarrer un bloc. * +* * +* Retour : Capacité de rassemblement du symbole. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_symbol_is_block_start(GBinSymbol *symbol) +{ + bool result; /* Statut à retourner */ + + switch (g_binary_symbol_get_target_type(symbol)) + { + case STP_ROUTINE: + case STP_OBJECT: + case STP_FUNCTION: + case STP_ENTRY_POINT: + case STP_STRING: + case STP_RO_STRING: + result = true; + break; + + default: + result = false; + break; + + } + + result |= symbol->block_start; + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : symbol = symbole à venir consulter. * * * * Description : Fournit un étiquette pour viser un symbole. * diff --git a/src/format/symbol.h b/src/format/symbol.h index 6f2078c..c616a85 100644 --- a/src/format/symbol.h +++ b/src/format/symbol.h @@ -83,6 +83,12 @@ int g_binary_symbol_cmp(const GBinSymbol **, const GBinSymbol **); /* Fournit le type du symbole. */ SymbolType g_binary_symbol_get_target_type(const GBinSymbol *); +/* Définit si un symbole est susceptible de démarrer un bloc. */ +void g_binary_symbol_define_as_block_start(GBinSymbol *, bool); + +/* Indique si un symbole est susceptible de démarrer un bloc. */ +bool g_binary_symbol_is_block_start(GBinSymbol *); + /* Fournit un étiquette pour viser un symbole. */ const char *g_binary_symbol_get_label(const GBinSymbol *); -- cgit v0.11.2-87-g4458