Allow display of negative offsets in print_address_symbolic()
When examining addresses associated with blocks with non-contiguous address ranges, it's not uncommon to see large positive offsets which, for some address width, actually represent a smaller negative offset. Here's an example taken from the test case (using the dw2-ranges-func-lo-cold executable): (gdb) x/5i foo_cold 0x40110d <foo+4294967277>: push %rbp 0x40110e <foo+4294967278>: mov %rsp,%rbp 0x401111 <foo+4294967281>: callq 0x401106 <baz> 0x401116 <foo+4294967286>: nop 0x401117 <foo+4294967287>: pop %rbp This commit, in conjuction with an earlier patch from this series, causes cases like the above to be displayed like this (below) instead: (gdb) x/5i foo_cold 0x40110d <foo_cold>: push %rbp 0x40110e <foo-18>: mov %rsp,%rbp 0x401111 <foo-15>: callq 0x401106 <baz> 0x401116 <foo-10>: nop 0x401117 <foo-9>: pop %rbp Note that the address of foo_cold is now (due to another patch) being displayed as <foo_cold> instead of <foo+BigOffset>. The subsequent lines are shown as negative offsets from foo. Disassembly using the "disassemble" command is somewhat affected by these changes: Before: (gdb) disassemble foo_cold Dump of assembler code for function foo: Address range 0x401120 to 0x40113b: 0x0000000000401120 <+0>: push %rbp 0x0000000000401121 <+1>: mov %rsp,%rbp 0x0000000000401124 <+4>: callq 0x401119 <bar> 0x0000000000401129 <+9>: mov 0x2ef1(%rip),%eax # 0x404020 <e> 0x000000000040112f <+15>: test %eax,%eax 0x0000000000401131 <+17>: je 0x401138 <foo+24> 0x0000000000401133 <+19>: callq 0x40110d <foo+4294967277> 0x0000000000401138 <+24>: nop 0x0000000000401139 <+25>: pop %rbp 0x000000000040113a <+26>: retq Address range 0x40110d to 0x401119: 0x000000000040110d <+-19>: push %rbp 0x000000000040110e <+-18>: mov %rsp,%rbp 0x0000000000401111 <+-15>: callq 0x401106 <baz> 0x0000000000401116 <+-10>: nop 0x0000000000401117 <+-9>: pop %rbp 0x0000000000401118 <+-8>: retq End of assembler dump. After: (gdb) disassemble foo_cold Dump of assembler code for function foo: Address range 0x401120 to 0x40113b: 0x0000000000401120 <+0>: push %rbp 0x0000000000401121 <+1>: mov %rsp,%rbp 0x0000000000401124 <+4>: callq 0x401119 <bar> 0x0000000000401129 <+9>: mov 0x2ef1(%rip),%eax # 0x404020 <e> 0x000000000040112f <+15>: test %eax,%eax 0x0000000000401131 <+17>: je 0x401138 <foo+24> 0x0000000000401133 <+19>: callq 0x40110d <foo_cold> 0x0000000000401138 <+24>: nop 0x0000000000401139 <+25>: pop %rbp 0x000000000040113a <+26>: retq Address range 0x40110d to 0x401119: 0x000000000040110d <-19>: push %rbp 0x000000000040110e <-18>: mov %rsp,%rbp 0x0000000000401111 <-15>: callq 0x401106 <baz> 0x0000000000401116 <-10>: nop 0x0000000000401117 <-9>: pop %rbp 0x0000000000401118 <-8>: retq End of assembler dump. Note that negative offsets are now displayed without the leading "+". Also, the callq to foo_cold is now displayed as such instead of a callq to foo with a large positive offset. gdb/ChangeLog: * printcmd.c (print_address_symbolic): Print negative offsets. (build_address_symbolic): Force signed arithmetic when computing offset.
This commit is contained in:
parent
2906593ffe
commit
a1530dc731
@ -1,3 +1,9 @@
|
||||
2019-07-30 Kevin Buettner <kevinb@redhat.com>
|
||||
|
||||
* printcmd.c (print_address_symbolic): Print negative offsets.
|
||||
(build_address_symbolic): Force signed arithmetic when computing
|
||||
offset.
|
||||
|
||||
2019-07-30 Christian Biesinger <cbiesinger@google.com>
|
||||
|
||||
PR/24474: Add a function to lookup static variables.
|
||||
@ -84,10 +90,6 @@
|
||||
* dwarf2-frame.c (dwarf2_frame_cache): Don't decode FDE instructions
|
||||
for entry pc when entry pc is out of range for that FDE.
|
||||
|
||||
* printcmd.c (print_address_symbolic): Print negative offsets.
|
||||
(build_address_symbolic): Force signed arithmetic when computing
|
||||
offset.
|
||||
|
||||
2019-07-26 Brian Callahan <bcallah@openbsd.org>
|
||||
|
||||
PR gdb/24839:
|
||||
|
@ -540,7 +540,7 @@ print_address_symbolic (struct gdbarch *gdbarch, CORE_ADDR addr,
|
||||
fputs_filtered ("<", stream);
|
||||
fputs_styled (name.c_str (), function_name_style.style (), stream);
|
||||
if (offset != 0)
|
||||
fprintf_filtered (stream, "+%u", (unsigned int) offset);
|
||||
fprintf_filtered (stream, "%+d", offset);
|
||||
|
||||
/* Append source filename and line number if desired. Give specific
|
||||
line # of this addr, if we have it; else line # of the nearest symbol. */
|
||||
@ -680,7 +680,7 @@ build_address_symbolic (struct gdbarch *gdbarch,
|
||||
&& name_location + max_symbolic_offset > name_location)
|
||||
return 1;
|
||||
|
||||
*offset = addr - name_location;
|
||||
*offset = (LONGEST) addr - name_location;
|
||||
|
||||
*name = name_temp;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user