diff options
Diffstat (limited to 'gdb/testsuite/gdb.python/py-disasm.py')
-rw-r--r-- | gdb/testsuite/gdb.python/py-disasm.py | 164 |
1 files changed, 139 insertions, 25 deletions
diff --git a/gdb/testsuite/gdb.python/py-disasm.py b/gdb/testsuite/gdb.python/py-disasm.py index 17a7e752935..ec6b0e8deca 100644 --- a/gdb/testsuite/gdb.python/py-disasm.py +++ b/gdb/testsuite/gdb.python/py-disasm.py @@ -25,6 +25,26 @@ from gdb.disassembler import Disassembler, DisassemblerResult current_pc = None +def builtin_disassemble_wrapper(info): + result = gdb.disassembler.builtin_disassemble(info) + assert result.length > 0 + assert len(result.parts) > 0 + tmp_str = "" + for p in result.parts: + assert(p.string == str(p)) + tmp_str += p.string + assert tmp_str == result.string + return result + + +def check_building_disassemble_result(): + """Check that we can create DisassembleResult objects correctly.""" + + result = gdb.disassembler.DisassemblerResult() + + print("PASS") + + def is_nop(s): return s == "nop" or s == "nop\t0" @@ -70,7 +90,7 @@ class ShowInfoRepr(TestDisassembler): def disassemble(self, info): comment = "\t## " + repr(info) - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) string = result.string + comment length = result.length return DisassemblerResult(length=length, string=string) @@ -94,7 +114,7 @@ class ShowInfoSubClassRepr(TestDisassembler): def disassemble(self, info): info = self.MyInfo(info) comment = "\t## " + repr(info) - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) string = result.string + comment length = result.length return DisassemblerResult(length=length, string=string) @@ -106,7 +126,7 @@ class ShowResultRepr(TestDisassembler): output.""" def disassemble(self, info): - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) comment = "\t## " + repr(result) string = result.string + comment length = result.length @@ -118,11 +138,11 @@ class ShowResultStr(TestDisassembler): resulting string in a comment within the disassembler output.""" def disassemble(self, info): - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) comment = "\t## " + str(result) string = result.string + comment length = result.length - return DisassemblerResult(length=length, string=string) + return DisassemblerResult(length=length, string=string, parts=None) class GlobalPreInfoDisassembler(TestDisassembler): @@ -138,7 +158,7 @@ class GlobalPreInfoDisassembler(TestDisassembler): if not isinstance(ar, gdb.Architecture): raise gdb.GdbError("invalid architecture type") - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) text = result.string + "\t## ad = 0x%x, ar = %s" % (ad, ar.name()) return DisassemblerResult(result.length, text) @@ -148,7 +168,7 @@ class GlobalPostInfoDisassembler(TestDisassembler): """Check the attributes of DisassembleInfo after disassembly has occurred.""" def disassemble(self, info): - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) ad = info.address ar = info.architecture @@ -169,7 +189,7 @@ class GlobalReadDisassembler(TestDisassembler): adds them as a comment to the disassembler output.""" def disassemble(self, info): - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) len = result.length str = "" for o in range(len): @@ -187,7 +207,7 @@ class GlobalAddrDisassembler(TestDisassembler): """Check the gdb.format_address method.""" def disassemble(self, info): - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) arch = info.architecture addr = info.address program_space = info.progspace @@ -214,7 +234,7 @@ class GdbErrorLateDisassembler(TestDisassembler): """Raise a GdbError after calling the builtin disassembler.""" def disassemble(self, info): - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) raise gdb.GdbError("GdbError after builtin disassembler") @@ -222,7 +242,7 @@ class RuntimeErrorLateDisassembler(TestDisassembler): """Raise a RuntimeError after calling the builtin disassembler.""" def disassemble(self, info): - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) raise RuntimeError("RuntimeError after builtin disassembler") @@ -235,7 +255,7 @@ class MemoryErrorEarlyDisassembler(TestDisassembler): info.read_memory(1, -info.address + 2) except gdb.MemoryError: tag = "## AFTER ERROR" - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) text = result.string + "\t" + tag return DisassemblerResult(result.length, text) @@ -245,7 +265,7 @@ class MemoryErrorLateDisassembler(TestDisassembler): before we return a result.""" def disassemble(self, info): - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) # The following read will throw an error. info.read_memory(1, -info.address + 2) return DisassemblerResult(1, "BAD") @@ -282,7 +302,7 @@ class TaggingDisassembler(TestDisassembler): self._tag = tag def disassemble(self, info): - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) text = result.string + "\t## tag = %s" % self._tag return DisassemblerResult(result.length, text) @@ -307,7 +327,7 @@ class GlobalCachingDisassembler(TestDisassembler): and cache the DisassembleInfo so that it is not garbage collected.""" GlobalCachingDisassembler.cached_insn_disas.append(info) GlobalCachingDisassembler.cached_insn_disas.append(self.MyInfo(info)) - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) text = result.string + "\t## CACHED" return DisassemblerResult(result.length, text) @@ -373,7 +393,7 @@ class ReadMemoryMemoryErrorDisassembler(TestDisassembler): def disassemble(self, info): info = self.MyInfo(info) - return gdb.disassembler.builtin_disassemble(info) + return builtin_disassemble_wrapper(info) class ReadMemoryGdbErrorDisassembler(TestDisassembler): @@ -389,7 +409,7 @@ class ReadMemoryGdbErrorDisassembler(TestDisassembler): def disassemble(self, info): info = self.MyInfo(info) - return gdb.disassembler.builtin_disassemble(info) + return builtin_disassemble_wrapper(info) class ReadMemoryRuntimeErrorDisassembler(TestDisassembler): @@ -405,7 +425,7 @@ class ReadMemoryRuntimeErrorDisassembler(TestDisassembler): def disassemble(self, info): info = self.MyInfo(info) - return gdb.disassembler.builtin_disassemble(info) + return builtin_disassemble_wrapper(info) class ReadMemoryCaughtMemoryErrorDisassembler(TestDisassembler): @@ -422,7 +442,7 @@ class ReadMemoryCaughtMemoryErrorDisassembler(TestDisassembler): def disassemble(self, info): info = self.MyInfo(info) try: - return gdb.disassembler.builtin_disassemble(info) + return builtin_disassemble_wrapper(info) except gdb.MemoryError: return None @@ -441,7 +461,7 @@ class ReadMemoryCaughtGdbErrorDisassembler(TestDisassembler): def disassemble(self, info): info = self.MyInfo(info) try: - return gdb.disassembler.builtin_disassemble(info) + return builtin_disassemble_wrapper(info) except gdb.GdbError as e: if e.args[0] == "exception message": return None @@ -462,7 +482,7 @@ class ReadMemoryCaughtRuntimeErrorDisassembler(TestDisassembler): def disassemble(self, info): info = self.MyInfo(info) try: - return gdb.disassembler.builtin_disassemble(info) + return builtin_disassemble_wrapper(info) except RuntimeError as e: if e.args[0] == "exception message": return None @@ -479,7 +499,7 @@ class MemorySourceNotABufferDisassembler(TestDisassembler): def disassemble(self, info): info = self.MyInfo(info) - return gdb.disassembler.builtin_disassemble(info) + return builtin_disassemble_wrapper(info) class MemorySourceBufferTooLongDisassembler(TestDisassembler): @@ -501,7 +521,101 @@ class MemorySourceBufferTooLongDisassembler(TestDisassembler): def disassemble(self, info): info = self.MyInfo(info) - return gdb.disassembler.builtin_disassemble(info) + return builtin_disassemble_wrapper(info) + + +class ErrorCreatingTextPart_NoArgs(TestDisassembler): + """Try to create a DisassemblerTextPart with no arguments.""" + + def disassemble(self, info): + part = info.text_part() + return None + + +class ErrorCreatingAddressPart_NoArgs(TestDisassembler): + """Try to create a DisassemblerAddressPart with no arguments.""" + + def disassemble(self, info): + part = info.address_part() + return None + + +class ErrorCreatingTextPart_NoString(TestDisassembler): + """Try to create a DisassemblerTextPart with no string argument.""" + + def disassemble(self, info): + part = info.text_part(gdb.disassembler.STYLE_TEXT) + return None + + +class ErrorCreatingTextPart_NoStyle(TestDisassembler): + """Try to create a DisassemblerTextPart with no string argument.""" + + def disassemble(self, info): + part = info.text_part(string="abc") + return None + + +class ErrorCreatingTextPart_StringAndParts(TestDisassembler): + """Try to create a DisassemblerTextPart with both a string and a parts list.""" + + def disassemble(self, info): + parts = [] + parts.append(info.text_part(gdb.disassembler.STYLE_TEXT, "p1")) + parts.append(info.text_part(gdb.disassembler.STYLE_TEXT, "p2")) + + return DisassemblerResult(length=4, string="p1p2", parts=parts) + + +class All_Text_Part_Styles(TestDisassembler): + """Create text parts with all styles.""" + + def disassemble(self, info): + parts = [] + parts.append(info.text_part(gdb.disassembler.STYLE_TEXT, "p1")) + parts.append(info.text_part(gdb.disassembler.STYLE_MNEMONIC, "p2")) + parts.append(info.text_part(gdb.disassembler.STYLE_SUB_MNEMONIC, "p3")) + parts.append(info.text_part(gdb.disassembler.STYLE_ASSEMBLER_DIRECTIVE, "p4")) + parts.append(info.text_part(gdb.disassembler.STYLE_REGISTER, "p5")) + parts.append(info.text_part(gdb.disassembler.STYLE_IMMEDIATE, "p6")) + parts.append(info.text_part(gdb.disassembler.STYLE_ADDRESS, "p7")) + parts.append(info.text_part(gdb.disassembler.STYLE_ADDRESS_OFFSET, "p8")) + parts.append(info.text_part(gdb.disassembler.STYLE_SYMBOL, "p9")) + parts.append(info.text_part(gdb.disassembler.STYLE_COMMENT_START, "p10")) + + result = builtin_disassemble_wrapper(info) + result = DisassemblerResult(length=result.length, parts=parts) + + tmp_str = ""; + for p in parts: + assert (p.string == str(p)) + tmp_str += str(p) + assert tmp_str == result.string + + return result + + +class Build_Result_Using_All_Parts(TestDisassembler): + """Disassemble an instruction and return a result that makes use of + text and address parts.""" + + def disassemble(self, info): + global current_pc + + parts = [] + parts.append(info.text_part(gdb.disassembler.STYLE_MNEMONIC, "fake")) + parts.append(info.text_part(gdb.disassembler.STYLE_TEXT, "\t")) + parts.append(info.text_part(gdb.disassembler.STYLE_REGISTER, "reg")) + parts.append(info.text_part(gdb.disassembler.STYLE_TEXT, ", ")) + addr_part = info.address_part(current_pc) + assert addr_part.address == current_pc + parts.append(addr_part) + parts.append(info.text_part(gdb.disassembler.STYLE_TEXT, ", ")) + parts.append(info.text_part(gdb.disassembler.STYLE_IMMEDIATE, "123")) + + result = builtin_disassemble_wrapper(info) + result = DisassemblerResult(length=result.length, parts=parts) + return result class BuiltinDisassembler(Disassembler): @@ -511,7 +625,7 @@ class BuiltinDisassembler(Disassembler): super().__init__("BuiltinDisassembler") def __call__(self, info): - return gdb.disassembler.builtin_disassemble(info) + return builtin_disassemble_wrapper(info) class AnalyzingDisassembler(Disassembler): @@ -606,7 +720,7 @@ class AnalyzingDisassembler(Disassembler): # Override the info object, this provides access to our # read_memory function. info = self.MyInfo(info, self._start, self._end, self._nop_bytes) - result = gdb.disassembler.builtin_disassemble(info) + result = builtin_disassemble_wrapper(info) # Record some informaiton about the first 'nop' instruction we find. if self._nop_index is None and is_nop(result.string): |