diff options
author | Doug Evans <xdje42@gmail.com> | 2015-08-14 21:45:54 -0700 |
---|---|---|
committer | Doug Evans <xdje42@gmail.com> | 2015-08-14 21:45:54 -0700 |
commit | 6ff0ba5f7b8a2b10642bbb233a32043595c55670 (patch) | |
tree | c5292016ff0e4c7a254c227d9a7c9579b05e8ff1 /gdb/testsuite | |
parent | b56ccc202ab674998baf52a710d736702734f9ab (diff) | |
download | gdb-6ff0ba5f7b8a2b10642bbb233a32043595c55670.zip gdb-6ff0ba5f7b8a2b10642bbb233a32043595c55670.tar.gz gdb-6ff0ba5f7b8a2b10642bbb233a32043595c55670.tar.bz2 |
New /s modifier for the disassemble command.
The "source centric" /m option to the disassemble command is often
unhelpful, e.g., in the presence of optimized code.
This patch adds a /s modifier that is better.
For one, /m only prints instructions from the originating source file,
leaving out instructions from e.g., inlined functions from other files.
gdb/ChangeLog:
PR gdb/11833
* NEWS: Document new /s modifier for the disassemble command.
* cli/cli-cmds.c (disassemble_command): Add support for /s.
(_initialize_cli_cmds): Update online docs of disassemble command.
* disasm.c: #include "source.h".
(struct deprecated_dis_line_entry): Renamed from dis_line_entry.
All uses updated.
(dis_line_entry): New struct.
(hash_dis_line_entry, eq_dis_line_entry): New functions.
(allocate_dis_line_table): New functions.
(maybe_add_dis_line_entry, line_has_code_p): New functions.
(dump_insns): New arg end_pc. All callers updated.
(do_mixed_source_and_assembly_deprecated): Renamed from
do_mixed_source_and_assembly. All callers updated.
(do_mixed_source_and_assembly): New function.
(gdb_disassembly): Handle /s (DISASSEMBLY_SOURCE).
* disasm.h (DISASSEMBLY_SOURCE_DEPRECATED): Renamed from
DISASSEMBLY_SOURCE. All uses updated.
(DISASSEMBLY_SOURCE): New macro.
* mi/mi-cmd-disas.c (mi_cmd_disassemble): New modes 4,5.
gdb/doc/ChangeLog:
* gdb.texinfo (Machine Code): Update docs for mixed source/assembly
disassembly.
(GDB/MI Data Manipulation): Update docs for new disassembly modes.
gdb/testsuite/ChangeLog:
* gdb.mi/mi-disassemble.exp: Update.
* gdb.base/disasm-optim.S: New file.
* gdb.base/disasm-optim.c: New file.
* gdb.base/disasm-optim.h: New file.
* gdb.base/disasm-optim.exp: New file.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/disasm-optim.S | 352 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/disasm-optim.c | 27 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/disasm-optim.exp | 40 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/disasm-optim.h | 26 | ||||
-rw-r--r-- | gdb/testsuite/gdb.mi/mi-disassemble.exp | 2 |
6 files changed, 454 insertions, 1 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 71989e7..3deb8a4 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-08-14 Doug Evans <xdje42@gmail.com> + + * gdb.mi/mi-disassemble.exp: Update. + * gdb.base/disasm-optim.S: New file. + * gdb.base/disasm-optim.c: New file. + * gdb.base/disasm-optim.h: New file. + * gdb.base/disasm-optim.exp: New file. + 2015-08-14 Keith Seitz <keiths@redhat.com> * lib/mi-support.exp (mi_make_breakpoint): Add option/handling for diff --git a/gdb/testsuite/gdb.base/disasm-optim.S b/gdb/testsuite/gdb.base/disasm-optim.S new file mode 100644 index 0000000..0856731 --- /dev/null +++ b/gdb/testsuite/gdb.base/disasm-optim.S @@ -0,0 +1,352 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright (C) 2015 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + This file was created with gcc -O2 -g -S -fverbose-asm -dA disasm-optim.c + and then cleaning up the output. */ + + .file "disasm-optim.c" + + .text + .p2align 4,,15 + .globl main + .type main, @function +main: +.LFB1: + .file 1 "disasm-optim.c" + # disasm-optim.c:24 + .loc 1 24 0 + .cfi_startproc + # disasm-optim.c:25 + .loc 1 25 0 + movl y(%rip), %eax +.LVL0: +.LBB4: +.LBB5: + .file 2 "disasm-optim.h" + # disasm-optim.h:21 + .loc 2 21 0 + testl %eax, %eax + js .L6 + # disasm-optim.h:25 + .loc 2 25 0 + leal 10(%rax), %edx + testl %eax, %eax + movl $1, %eax +.LVL1: + cmovne %edx, %eax +.LVL2: +.L3: +.LBE5: +.LBE4: + # disasm-optim.c:25 + .loc 1 25 0 + movl %eax, x(%rip) + # disasm-optim.c:27 + .loc 1 27 0 + xorl %eax, %eax + ret +.LVL3: +.L6: +.LBB7: +.LBB6: + # disasm-optim.h:22 + .loc 2 22 0 + addl %eax, %eax +.LVL4: + jmp .L3 +.LBE6: +.LBE7: + .cfi_endproc +.LFE1: + .size main, .-main + .comm y,4,4 + .comm x,4,4 + .text +.Letext0: + .section .debug_info,"",@progbits +.Ldebug_info0: + .long 0xb1 # Length of Compilation Unit Info + .value 0x4 # DWARF version number + .long .Ldebug_abbrev0 # Offset Into Abbrev. Section + .byte 0x8 # Pointer Size (in bytes) + .uleb128 0x1 # (DIE (0xb) DW_TAG_compile_unit) + .long .LASF0 # DW_AT_producer: "GNU C 4.9.2 20150212 (Red Hat 4.9.2-6) -mtune=generic -march=x86-64 -g -O2" + .byte 0x1 # DW_AT_language + .long .LASF1 # DW_AT_name: "disasm-optim.c" + .long .LASF2 # DW_AT_comp_dir: "/main/disassemble3/gdb/testsuite/gdb.base" + .long .Ldebug_ranges0+0x30 # DW_AT_ranges + .quad 0 # DW_AT_low_pc + .long .Ldebug_line0 # DW_AT_stmt_list + .uleb128 0x2 # (DIE (0x29) DW_TAG_subprogram) + # DW_AT_external + .ascii "foo\0" # DW_AT_name + .byte 0x2 # DW_AT_decl_file (disasm-optim.h) + .byte 0x13 # DW_AT_decl_line + # DW_AT_prototyped + .long 0x43 # DW_AT_type + .byte 0x3 # DW_AT_inline + .long 0x43 # DW_AT_sibling + .uleb128 0x3 # (DIE (0x39) DW_TAG_formal_parameter) + .ascii "a\0" # DW_AT_name + .byte 0x2 # DW_AT_decl_file (disasm-optim.h) + .byte 0x13 # DW_AT_decl_line + .long 0x43 # DW_AT_type + .byte 0 # end of children of DIE 0x29 + .uleb128 0x4 # (DIE (0x43) DW_TAG_base_type) + .byte 0x4 # DW_AT_byte_size + .byte 0x5 # DW_AT_encoding + .ascii "int\0" # DW_AT_name + .uleb128 0x5 # (DIE (0x4a) DW_TAG_subprogram) + # DW_AT_external + .long .LASF3 # DW_AT_name: "main" + .byte 0x1 # DW_AT_decl_file (disasm-optim.c) + .byte 0x17 # DW_AT_decl_line + .long 0x43 # DW_AT_type + .quad .LFB1 # DW_AT_low_pc + .quad .LFE1-.LFB1 # DW_AT_high_pc + .uleb128 0x1 # DW_AT_frame_base + .byte 0x9c # DW_OP_call_frame_cfa + # DW_AT_GNU_all_call_sites + .long 0x89 # DW_AT_sibling + .uleb128 0x6 # (DIE (0x6b) DW_TAG_inlined_subroutine) + .long 0x29 # DW_AT_abstract_origin + .quad .LBB4 # DW_AT_entry_pc + .long .Ldebug_ranges0+0 # DW_AT_ranges + .byte 0x1 # DW_AT_call_file (disasm-optim.c) + .byte 0x19 # DW_AT_call_line + .uleb128 0x7 # (DIE (0x7e) DW_TAG_formal_parameter) + .long 0x39 # DW_AT_abstract_origin + .long .LLST0 # DW_AT_location + .byte 0 # end of children of DIE 0x6b + .byte 0 # end of children of DIE 0x4a + .uleb128 0x8 # (DIE (0x89) DW_TAG_variable) + .ascii "x\0" # DW_AT_name + .byte 0x1 # DW_AT_decl_file (disasm-optim.c) + .byte 0x14 # DW_AT_decl_line + .long 0x9c # DW_AT_type + # DW_AT_external + .uleb128 0x9 # DW_AT_location + .byte 0x3 # DW_OP_addr + .quad x + .uleb128 0x9 # (DIE (0x9c) DW_TAG_volatile_type) + .long 0x43 # DW_AT_type + .uleb128 0x8 # (DIE (0xa1) DW_TAG_variable) + .ascii "y\0" # DW_AT_name + .byte 0x1 # DW_AT_decl_file (disasm-optim.c) + .byte 0x14 # DW_AT_decl_line + .long 0x9c # DW_AT_type + # DW_AT_external + .uleb128 0x9 # DW_AT_location + .byte 0x3 # DW_OP_addr + .quad y + .byte 0 # end of children of DIE 0xb + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .uleb128 0x1 # (abbrev code) + .uleb128 0x11 # (TAG: DW_TAG_compile_unit) + .byte 0x1 # DW_children_yes + .uleb128 0x25 # (DW_AT_producer) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x13 # (DW_AT_language) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3 # (DW_AT_name) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x1b # (DW_AT_comp_dir) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x55 # (DW_AT_ranges) + .uleb128 0x17 # (DW_FORM_sec_offset) + .uleb128 0x11 # (DW_AT_low_pc) + .uleb128 0x1 # (DW_FORM_addr) + .uleb128 0x10 # (DW_AT_stmt_list) + .uleb128 0x17 # (DW_FORM_sec_offset) + .byte 0 + .byte 0 + .uleb128 0x2 # (abbrev code) + .uleb128 0x2e # (TAG: DW_TAG_subprogram) + .byte 0x1 # DW_children_yes + .uleb128 0x3f # (DW_AT_external) + .uleb128 0x19 # (DW_FORM_flag_present) + .uleb128 0x3 # (DW_AT_name) + .uleb128 0x8 # (DW_FORM_string) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x27 # (DW_AT_prototyped) + .uleb128 0x19 # (DW_FORM_flag_present) + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x20 # (DW_AT_inline) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x1 # (DW_AT_sibling) + .uleb128 0x13 # (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x3 # (abbrev code) + .uleb128 0x5 # (TAG: DW_TAG_formal_parameter) + .byte 0 # DW_children_no + .uleb128 0x3 # (DW_AT_name) + .uleb128 0x8 # (DW_FORM_string) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x4 # (abbrev code) + .uleb128 0x24 # (TAG: DW_TAG_base_type) + .byte 0 # DW_children_no + .uleb128 0xb # (DW_AT_byte_size) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3e # (DW_AT_encoding) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3 # (DW_AT_name) + .uleb128 0x8 # (DW_FORM_string) + .byte 0 + .byte 0 + .uleb128 0x5 # (abbrev code) + .uleb128 0x2e # (TAG: DW_TAG_subprogram) + .byte 0x1 # DW_children_yes + .uleb128 0x3f # (DW_AT_external) + .uleb128 0x19 # (DW_FORM_flag_present) + .uleb128 0x3 # (DW_AT_name) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x11 # (DW_AT_low_pc) + .uleb128 0x1 # (DW_FORM_addr) + .uleb128 0x12 # (DW_AT_high_pc) + .uleb128 0x7 # (DW_FORM_data8) + .uleb128 0x40 # (DW_AT_frame_base) + .uleb128 0x18 # (DW_FORM_exprloc) + .uleb128 0x2117 # (DW_AT_GNU_all_call_sites) + .uleb128 0x19 # (DW_FORM_flag_present) + .uleb128 0x1 # (DW_AT_sibling) + .uleb128 0x13 # (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x6 # (abbrev code) + .uleb128 0x1d # (TAG: DW_TAG_inlined_subroutine) + .byte 0x1 # DW_children_yes + .uleb128 0x31 # (DW_AT_abstract_origin) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x52 # (DW_AT_entry_pc) + .uleb128 0x1 # (DW_FORM_addr) + .uleb128 0x55 # (DW_AT_ranges) + .uleb128 0x17 # (DW_FORM_sec_offset) + .uleb128 0x58 # (DW_AT_call_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x59 # (DW_AT_call_line) + .uleb128 0xb # (DW_FORM_data1) + .byte 0 + .byte 0 + .uleb128 0x7 # (abbrev code) + .uleb128 0x5 # (TAG: DW_TAG_formal_parameter) + .byte 0 # DW_children_no + .uleb128 0x31 # (DW_AT_abstract_origin) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x2 # (DW_AT_location) + .uleb128 0x17 # (DW_FORM_sec_offset) + .byte 0 + .byte 0 + .uleb128 0x8 # (abbrev code) + .uleb128 0x34 # (TAG: DW_TAG_variable) + .byte 0 # DW_children_no + .uleb128 0x3 # (DW_AT_name) + .uleb128 0x8 # (DW_FORM_string) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x3f # (DW_AT_external) + .uleb128 0x19 # (DW_FORM_flag_present) + .uleb128 0x2 # (DW_AT_location) + .uleb128 0x18 # (DW_FORM_exprloc) + .byte 0 + .byte 0 + .uleb128 0x9 # (abbrev code) + .uleb128 0x35 # (TAG: DW_TAG_volatile_type) + .byte 0 # DW_children_no + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .byte 0 + .byte 0 + .byte 0 + .section .debug_loc,"",@progbits +.Ldebug_loc0: +.LLST0: + .quad .LVL0 # Location list begin address (*.LLST0) + .quad .LVL1 # Location list end address (*.LLST0) + .value 0x1 # Location expression size + .byte 0x50 # DW_OP_reg0 + .quad .LVL1 # Location list begin address (*.LLST0) + .quad .LVL2 # Location list end address (*.LLST0) + .value 0x3 # Location expression size + .byte 0x71 # DW_OP_breg1 + .sleb128 -10 + .byte 0x9f # DW_OP_stack_value + .quad .LVL3 # Location list begin address (*.LLST0) + .quad .LVL4 # Location list end address (*.LLST0) + .value 0x1 # Location expression size + .byte 0x50 # DW_OP_reg0 + .quad 0 # Location list terminator begin (*.LLST0) + .quad 0 # Location list terminator end (*.LLST0) + .section .debug_aranges,"",@progbits + .long 0x2c # Length of Address Ranges Info + .value 0x2 # DWARF Version + .long .Ldebug_info0 # Offset of Compilation Unit Info + .byte 0x8 # Size of Address + .byte 0 # Size of Segment Descriptor + .value 0 # Pad to 16 byte boundary + .value 0 + .quad .LFB1 # Address + .quad .LFE1-.LFB1 # Length + .quad 0 + .quad 0 + .section .debug_ranges,"",@progbits +.Ldebug_ranges0: + .quad .LBB4 # Offset 0 + .quad .LBE4 + .quad .LBB7 + .quad .LBE7 + .quad 0 + .quad 0 + .quad .LFB1 # Offset 0x30 + .quad .LFE1 + .quad 0 + .quad 0 + .section .debug_line,"",@progbits +.Ldebug_line0: + .section .debug_str,"MS",@progbits,1 +.LASF2: + .string "/main/disassemble3/gdb/testsuite/gdb.base" +.LASF1: + .string "disasm-optim.c" +.LASF3: + .string "main" +.LASF0: + .string "GNU C 4.9.2 20150212 (Red Hat 4.9.2-6) -mtune=generic -march=x86-64 -g -O2" + .ident "GCC: (GNU) 4.9.2 20150212 (Red Hat 4.9.2-6)" + .section .note.GNU-stack,"",@progbits diff --git a/gdb/testsuite/gdb.base/disasm-optim.c b/gdb/testsuite/gdb.base/disasm-optim.c new file mode 100644 index 0000000..710c8a7 --- /dev/null +++ b/gdb/testsuite/gdb.base/disasm-optim.c @@ -0,0 +1,27 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright (C) 2015 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "disasm-optim.h" + +volatile int x, y; + +int +main () +{ + x = foo (y); + return 0; +} diff --git a/gdb/testsuite/gdb.base/disasm-optim.exp b/gdb/testsuite/gdb.base/disasm-optim.exp new file mode 100644 index 0000000..ef6b7be --- /dev/null +++ b/gdb/testsuite/gdb.base/disasm-optim.exp @@ -0,0 +1,40 @@ +# Copyright (C) 2015 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# This test exercises disassemble /s with optimized and inlined code. + +if { ![istarget "x86_64-*-linux*"] } { + continue +} + +standard_testfile .S + +if { [prepare_for_testing ${testfile}.exp $testfile ${testfile}.S {nodebug}] } { + return -1 +} + +if ![runto_main] { + return -1 +} + +gdb_test_sequence "disassemble /s main" \ + "Disassemble main with source" { + "Dump of assembler code for function main:" + "disasm-optim\\.c:\r\n24" + "disasm-optim\\.h:\r\n21" + "disasm-optim\\.c:\r\n25" + "disasm-optim\\.h:\r\n22" + "End of assembler dump\\." + } diff --git a/gdb/testsuite/gdb.base/disasm-optim.h b/gdb/testsuite/gdb.base/disasm-optim.h new file mode 100644 index 0000000..8229d13 --- /dev/null +++ b/gdb/testsuite/gdb.base/disasm-optim.h @@ -0,0 +1,26 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright (C) 2015 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +extern inline int +foo (int a) +{ + if (a < 0) + return a * 2; + if (a == 0) + return 1; + return a + 10; +} diff --git a/gdb/testsuite/gdb.mi/mi-disassemble.exp b/gdb/testsuite/gdb.mi/mi-disassemble.exp index 4f5a352..f97c471 100644 --- a/gdb/testsuite/gdb.mi/mi-disassemble.exp +++ b/gdb/testsuite/gdb.mi/mi-disassemble.exp @@ -223,7 +223,7 @@ proc test_disassembly_bogus_args {} { "data-disassemble mix different args" mi_gdb_test "789-data-disassemble -f basics.c -l $line_main_body -- 9" \ - "789\\^error,msg=\"-data-disassemble: Mode argument must be 0, 1, 2, or 3.\"" \ + "789\\^error,msg=\"-data-disassemble: Mode argument must be in the range 0-5.\"" \ "data-disassemble wrong mode arg" } |