From 7769cb74f206e265e795edbf69f93ec798631d5a Mon Sep 17 00:00:00 2001 From: pompolic <pompolic@special-circumstanc.es> Date: Mon, 13 Sep 2021 14:24:04 +0200 Subject: [PATCH] (WIP) Finish removing gdb.parse_and_eval() statements --- gdb-port/parser-type-instrumentation-gdb.py | 135 +++++++++++++++----- 1 file changed, 102 insertions(+), 33 deletions(-) diff --git a/gdb-port/parser-type-instrumentation-gdb.py b/gdb-port/parser-type-instrumentation-gdb.py index 5555e87..2908dfe 100644 --- a/gdb-port/parser-type-instrumentation-gdb.py +++ b/gdb-port/parser-type-instrumentation-gdb.py @@ -399,15 +399,21 @@ class IgnoreSeqEnv(HParserEnv): class IndirectEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() + hindirectenv_t = gdb.lookup_type("HIndirectEnv") + hindirectenv_p_t = hindirectenv_t.pointer() + parser_env = parser_val['env'].cast(hindirectenv_p_t).dereference() - member_parser_p = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->parser") + #member_parser_p = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->parser") + member_parser_p = parser_env['parser'] parser_obj = top_level_parse.add_or_get_parser(member_parser_p) if parser_obj.name is None: parser_obj.name_parser( self.name_from_vtable(parser_obj) ) self.member_parser = parser_obj - touched = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->touched") + #touched = gdb.parse_and_eval("((HIndirectEnv*) parser->env)->touched") + touched = parser_env['touched'] self.touched = bool(touched) - super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.member_parser), str(self.touched)]) @@ -416,15 +422,22 @@ class IntRangeEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() + hrange_t = gdb.lookup_type("HRange") + hrange_p_t = hrange_t.pointer() + parser_env = parser_val['env'].cast(hrange_p_t).dereference() - member_parser_p = gdb.parse_and_eval("((HRange*) parser->env)->p") + #member_parser_p = gdb.parse_and_eval("((HRange*) parser->env)->p") + member_parser_p = parser_env['p'] parser_obj = top_level_parse.add_or_get_parser(member_parser_p) if parser_obj.name is None: parser_obj.name_parser( self.name_from_vtable(parser_obj) ) self.member_parser = parser_obj - lower_val = gdb.parse_and_eval("((HRange*) parser->env)->lower") + #lower_val = gdb.parse_and_eval("((HRange*) parser->env)->lower") + lower_val = parser_env['lower'] self.lower = int(lower_val) - upper_val = gdb.parse_and_eval("((HRange*) parser->env)->upper") + #upper_val = gdb.parse_and_eval("((HRange*) parser->env)->upper") + upper_val = parser_env['upper'] self.upper = int(upper_val) @@ -435,14 +448,20 @@ class LengthValueEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() + hlenval_t = gdb.lookup_type("HLenVal") + hlenval_p_t = hlenval_t.pointer() + parser_env = parser_val['env'].cast(hlenval_p_t).dereference() - length_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->length") + #length_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->length") + length_parser_p = parser_env['length'] length_parser_obj = top_level_parse.add_or_get_parser(length_parser_p) if length_parser_obj.name is None: length_parser_obj.name_parser( self.name_from_vtable(length_parser_obj) ) self.length_parser = length_parser_obj - value_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->value") + #value_parser_p = gdb.parse_and_eval("((HLenVal *) parser->env)->value") + value_parser_p = parser_env['value'] value_parser_obj = top_level_parse.add_or_get_parser(value_parser_p) if value_parser_obj.name is None: value_parser_obj.name_parser( self.name_from_vtable(value_parser_obj) ) @@ -454,13 +473,26 @@ class LengthValueEnv(HParserEnv): class ManyEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser - - h_repeat_p = gdb.parse_and_eval("(HSequence*) parser->env") - self.count = gdb.parse_and_eval("((HRepeat *) parser->env)->count") - # TODO: resolve these pointers, make parser objects - self.separator = gdb.parse_and_eval("((HRepeat *) parser->env)->sep") - self.p = gdb.parse_and_eval("((HRepeat *) parser->env)->p") super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() + hrepeat_t = gdb.lookup_type("HRepeat") + hrepeat_p_t = hrepeat_t.pointer() + parser_env = parser_val['env'].cast(hrepeat_p_t).dereference() + + #self.count = gdb.parse_and_eval("((HRepeat *) parser->env)->count") + self.count = parser_env['count'] + #self.separator = gdb.parse_and_eval("((HRepeat *) parser->env)->sep") + separator_p = parser_env['separator'] + separator_p_obj = top_level_parse.add_or_get_parser(separator_p) + if separator_p_obj.name is None: + separator_p_obj.name_parser( self.name_from_vtable(separator_p_obj) ) + self.separator = separator_p_obj + #self.p = gdb.parse_and_eval("((HRepeat *) parser->env)->p") + p_ptr = parser_env['p'] + p_obj = top_level_parse.add_or_get_parser(p_ptr) + if p_obj.name is None: + p_obj.name_parser( self.name_from_vtable(p_ptr) ) + self.p = p_obj def __str__(self): return "P: " + str(self.p) + ", sep: " + str(self.separator) + ", count: " + str(self.count) @@ -469,8 +501,10 @@ class NotEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() - member_p = gdb.parse_and_eval("(HParser*) parser->env") + #member_p = gdb.parse_and_eval("(HParser*) parser->env") + member_p = parser_val['env'].cast(self_hparser_p_t) parser_obj = top_level_parse.add_or_get_parser(member_p) if parser_obj.name is None: parser_obj.name_parser( self.name_from_vtable(parser_obj) ) @@ -491,8 +525,10 @@ class OptionalEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() - member_p = gdb.parse_and_eval("(HParser*) parser->env") + #member_p = gdb.parse_and_eval("(HParser*) parser->env") + member_p = parser_val['env'].cast(self_hparser_p_t) parser_obj = top_level_parse.add_or_get_parser(member_p) if parser_obj.name is None: parser_obj.name_parser( self.name_from_vtable(parser_obj) ) @@ -533,13 +569,18 @@ class PermutationEnv(HParserEnv): class SeekEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() + hseek_t = gdb.lookup_type("HSeek") + hseek_p_t = hseek_t.pointer() + parser_env = parser_val['env'].cast(hseek_p_t).dereference() - offset_val = gdb.parse_and_eval("((HSeek *) parser->env)->offset") + #offset_val = gdb.parse_and_eval("((HSeek *) parser->env)->offset") + offset_val = parser_env['offset'] self.offset = int(offset_val) - whence_val = gdb.parse_and_eval("((HSeek *) parser->env)->whence") + #whence_val = gdb.parse_and_eval("((HSeek *) parser->env)->whence") + whence_val = parser_env['whence'] self.whence = int(whence_val) - #TODO: enum for whence? - super().__init__(parser, top_level_parse) def __str__(self): return str([str(self.offset), str(self.whence)]) @@ -547,10 +588,13 @@ class SeekEnv(HParserEnv): class SkipEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() + uintptr_t = gdb.lookup_type("uintptr_t") - skip_val = gdb.parse_and_eval("((uintptr_t) parser->env)") + #skip_val = gdb.parse_and_eval("((uintptr_t) parser->env)") + skip_val = parser_val['env'].cast(uintptr_t) self.skip = int(skip_val) - super().__init__(parser, top_level_parse) def __str__(self): return str(self.skip) @@ -563,7 +607,6 @@ class TellEnv(HParserEnv): def __str__(self): return "[]" -# TODO: numeric parameter passed to parse_and_eval class SequenceEnv(HParserEnv): def __init__(self, parser, top_level_parse): super().__init__(parser, top_level_parse) @@ -596,13 +639,19 @@ class SequenceEnv(HParserEnv): class TokenEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser + super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() + htoken_t = gdb.lookup_type("HToken") + htoken_p_t = htoken_t.pointer() + parser_env = parser_val['env'].cast(htoken_p_t).dereference() - str_p = gdb.parse_and_eval("((HToken *) parser->env)->str") + #str_p = gdb.parse_and_eval("((HToken *) parser->env)->str") + str_p = parser_env['str'] self.token = str_p - str_len = gdb.parse_and_eval("((HToken *) parser->env)->len") + #str_len = gdb.parse_and_eval("((HToken *) parser->env)->len") + str_len = parser_env['len'] self.str_len = int(str_len) #TODO: get str_len bytes from memory and save it - super().__init__(parser, top_level_parse) def __str__(self): return str(hex(self.token)) @@ -620,13 +669,19 @@ class GetEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() + hstoredvalue_t = gdb.lookup_type("HStoredValue") + hstoredvalue_p_t = hstoredvalue_t.pointer() + parser_env = parser_val['env'].cast(hstoredvalue_p_t).dereference() - member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p") + #member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p") + member_parser_p = parser_env['p'] parser_obj = top_level_parse.add_or_get_parser(member_parser_p) if parser_obj.name is None: parser_obj.name_parser( self.name_from_vtable(parser_obj) ) self.member_parser = parser_obj - key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key") + #key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key") + key_p = parser_env['key'] self.key = int(key_p) def __str__(self): @@ -636,13 +691,19 @@ class PutEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() + hstoredvalue_t = gdb.lookup_type("HStoredValue") + hstoredvalue_p_t = hstoredvalue_t.pointer() + parser_env = parser_val['env'].cast(hstoredvalue_p_t).dereference() - member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p") + #member_parser_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->p") + member_parser_p = parser_env['p'] parser_obj = top_level_parse.add_or_get_parser(member_parser_p) if parser_obj.name is None: parser_obj.name_parser( self.name_from_vtable(parser_obj) ) self.member_parser = parser_obj - key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key") + #key_p = gdb.parse_and_eval("((HStoredValue *) parse->env)->key") + key_p = parser_env['key'] self.key = int(key_p) def __str__(self): @@ -652,8 +713,10 @@ class WhitespaceEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() - member_parser_p = gdb.parse_and_eval("(HParser *) parse->env") + #member_parser_p = gdb.parse_and_eval("(HParser *) parse->env") + member_p = parser_val['env'].cast(self_hparser_p_t) parser_obj = top_level_parse.add_or_get_parser(member_parser_p) if parser_obj.name is None: parser_obj.name_parser( self.name_from_vtable(parser_obj) ) @@ -666,13 +729,19 @@ class XorEnv(HParserEnv): def __init__(self, parser, top_level_parse): self.parser = parser super().__init__(parser, top_level_parse) + parser_val = gdb.Value(parser).cast(self.hparser_p_t).dereference() + htwoparsers_t = gdb.lookup_type("HTwoParsers") + htwoparsers_p_t = htwoparsers_t.pointer() + parser_env = parser_val['env'].cast(htwoparsers_p_t).dereference() - p1_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p1") + #p1_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p1") + p1_p = parser_env['p1'] p1_obj = top_level_parse.add_or_get_parser(p1_p) if p1_obj.name is None: p1_obj.name_parser( self.name_from_vtable(p1_obj) ) self.p1 = p1_obj - p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2") + #p2_p = gdb.parse_and_eval("((HTwoParsers *) parser->env)->p2") + p2_p = parser_env['p2'] p2_obj = top_level_parse.add_or_get_parser(p2_p) if p2_obj.name is None: p2_obj.name_parser( self.name_from_vtable(p2_obj) ) -- GitLab