aboutsummaryrefslogtreecommitdiff
path: root/gdb
AgeCommit message (Collapse)AuthorFilesLines
2015-05-08[PR python/18291] Fix printing of "disabled" status of xmethod matchers.Siva Chandra4-2/+16
gdb/ChangeLog: PR python/18291 * python/lib/gdb/command/xmethods.py (print_xm_info): Fix typo. Print xmethod matcher status. gdb/testsuite/ChangeLog: PR python/18291 * gdb.python/py-xmethods.exp: Add tests.
2015-05-08Fix PR 18208: update /proc/pid/coredump_filter by c codeYao Qi3-9/+31
Hi, We see some fails in gdb.base/coredump-filter.exp when we do remote gdbserver testing, like what I did for arm/aarch64 linux testing or run it with board file remote-gdbserver-on-localhost $ make check RUNTESTFLAGS='--target_board=remote-gdbserver-on-localhost coredump-filter.exp' we find that this line in the test doesn't work as expected, remote_exec target "sh -c \"echo $filter_flag > /proc/$ipid/coredump_filter\"" although such pattern has been used in gdb testsuite somewhere else, but the special thing here is that we redirect the output to /proc/$ipid/coredump_filter on the remote target. DejaGNU will redirect the output from the remote target to local, and looks tcl gets confused by these two redirection. After trying pass different parameters to remote_exec and hacking remote_exec/rsh_exec/local_exec, I got no success, I decide to give up, and try to update /proc/$ipid/coredump_filter by the c code directly. This patch adds a c function set_coredump_filter to update coredump_filter, and GDB calls it. gdb/testsuite: 2015-05-08 Yao Qi <yao.qi@linaro.org> PR gdb/18208 * gdb.base/coredump-filter.c (set_coredump_filter): New function. * gdb.base/coredump-filter.exp (do_save_core): Call inferior function set_coredump_filter, and remove remote_exec call. Remove argument ipid. Callers update. (top level): Don't get inferior's PID.
2015-05-08[gdbserver] Disable conditional breakpoints on no-hardware-single-step targetsYao Qi8-1/+53
GDBserver steps over breakpoint if the condition is false, but if target doesn't support hardware single step, the step over is very simple, if not incorrect, in linux-arm-low.c: /* We only place breakpoints in empty marker functions, and thread locking is outside of the function. So rather than importing software single-step, we can just run until exit. */ static CORE_ADDR arm_reinsert_addr (void) { struct regcache *regcache = get_thread_regcache (current_thread, 1); unsigned long pc; collect_register_by_name (regcache, "lr", &pc); return pc; } and linux-mips-low.c does the same. GDBserver sets a breakpoint at the return address of the current function, resume and wait the program hits the breakpoint in order to achieve "breakpoint step over". What if program hits other user breakponits during this "step over"? It is worse if the arm/thumb interworking is considered. Nowadays, GDBserver arm backend unconditionally inserts arm breakpoint, /* Define an ARM-mode breakpoint; we only set breakpoints in the C library, which is most likely to be ARM. If the kernel supports clone events, we will never insert a breakpoint, so even a Thumb C library will work; so will mixing EABI/non-EABI gdbserver and application. */ (const unsigned char *) &arm_breakpoint, (const unsigned char *) &arm_eabi_breakpoint, note that the comments are no longer valid as C library can be compiled in thumb mode. When GDBserver steps over a breakpoint in arm mode function, which returns to thumb mode, GDBserver will insert arm mode breakpoint by mistake and the program will crash. GDBserver alone is unable to determine the arm/thumb mode given a PC address. See how GDB does it in arm-tdep.c:arm_pc_is_thumb. After thinking about how to teach GDBserver inserting right breakpoint (arm or thumb) for a while, I reconsider it from a different direction that it may be unreasonable to run target-side conditional breakpoint for targets without hardware single step. Pedro also pointed this out here https://sourceware.org/ml/gdb-patches/2015-04/msg00337.html This patch is to add a new target_ops hook supports_conditional_breakpoints, and only reply ";ConditionalBreakpoints+" if it is true. On linux targets, supports_conditional_breakpoints returns true if target has hardware single step, on other targets, (win32, lynx, nto, spu), set it to NULL, because conditional breakpoint is a linux-specific feature. gdb/gdbserver: 2015-05-08 Yao Qi <yao.qi@linaro.org> * linux-low.c (linux_supports_conditional_breakpoints): New function. (linux_target_ops): Install new target method. * lynx-low.c (lynx_target_ops): Install NULL hook for supports_conditional_breakpoints. * nto-low.c (nto_target_ops): Likewise. * spu-low.c (spu_target_ops): Likewise. * win32-low.c (win32_target_ops): Likewise. * server.c (handle_query): Check target_supports_conditional_breakpoints. * target.h (struct target_ops) <supports_conditional_breakpoints>: New field. (target_supports_conditional_breakpoints): New macro.
2015-05-08S390: Fix for inadvertently setting 24-bit mode in fill_gregsetAndreas Arnez2-9/+25
On 64-bit S390 platforms, for programs compiled with -m31, it could happen that GDB inadvertently cleared the inferior's 31-bit addressing mode bit and left the inferior running in 24-bit addressing mode. In particular this occurred with checkpoint.exp, when the "restore" command needed to create a new regcache copy: At the time when the PSWM register was copied over, the addressing mode bit was taken from the PSWA register, which was still zero since it had not been copied yet. And when the PSWA register was copied, the addressing mode was not updated again. The fix affects fill_gregset, where the bits "belonging" to each of the PSWA and PSWM registers are now carefully separated. The addressing mode bit is no longer touched when writing PSWM, and -- more importantly -- it *is* written when writing PSWA. gdb/ChangeLog: * s390-linux-nat.c (fill_gregset): Avoid relying on the PSWA register in the regcache when treating the PSWM register, and vice versa.
2015-05-08Skip watch_thread_num.exp on targets without access watchpointsAndreas Arnez2-1/+8
Since watch_thread_num.exp was changed to use access watchpoints, the test case fails on s390 and s390x, since those targets do not support access watchpoints. This patch skips the test case on such targets. gdb/testsuite/ChangeLog: * gdb.base/watch_thread_num.exp: Skip test on targets without access watchpoints.
2015-05-07Remove unused td_ta_map_id2thr codeGary Benson2-6/+6
linux-thread-db.c initializes td_ta_map_id2thr but never uses it. This commit removes this dead code. gdb/ChangeLog: * linux-thread-db.c (struct thread_db_info) <td_ta_map_id2thr_p>: Remove field. (try_thread_db_load_1): Remove initialization for the above.
2015-05-07Remove unused td_thr_validate codeGary Benson2-5/+6
linux-thread-db.c initializes td_thr_validate but never uses it. This commit removes this dead code. gdb/ChangeLog: * linux-thread-db.c (struct thread_db_info) <td_thr_validate_p>: Remove field. (try_thread_db_load_1): Remove initialization for the above.
2015-05-06compile: Support relocation to GNU-IFUNCsJan Kratochvil2-0/+9
Calling memcpy() could fail as memcpy() from libc is GNU-IFUNC. gdb/ChangeLog 2015-05-06 Jan Kratochvil <jan.kratochvil@redhat.com> * compile/compile-object-load.c (compile_object_load): Support mst_text_gnu_ifunc.
2015-05-06Code cleanup: compile: Constify some parametersJan Kratochvil3-7/+19
gdb/ChangeLog 2015-05-06 Jan Kratochvil <jan.kratochvil@redhat.com> * compile/compile.c (compile_to_object): Make the cmd_string parameter const. Use new variables for the const compatibility. (eval_compile_command): Make the cmd_string parameter const. * compile/compile.h (eval_compile_command): Make the cmd_string parameter const.
2015-05-06PR server/18081: gdbserver crashes when providing an unexisting binaryPedro Alves4-0/+75
$ ./gdbserver :1234 blah Process blah created; pid = 16471 Cannot exec blah: No such file or directory. Child exited with status 127 Killing process(es): 16471 ../../../../src/binutils-gdb/gdb/gdbserver/linux-low.c:920: A problem internal to GDBserver has been detected. kill_wait_lwp: Assertion `res > 0' failed. GDBserver shouldn't even be trying to kill that process. GDBserver kills or detaches from all processes on exit, and due to a missing mourn_inferior call, GDBserver tries to kill the process that it had already seen exit. Tested on x86_64 Fedora 20. New test included. I emulated what Windows outputs by hacking an error call in linux_create_inferior. gdb/gdbserver/ChangeLog: 2015-05-06 Pedro Alves <palves@redhat.com> PR server/18081 * server.c (start_inferior): If the process exits, mourn it. gdb/testsuite/ChangeLog: 2015-05-06 Pedro Alves <palves@redhat.com> PR server/18081 * gdb.server/non-existing-program.exp: New file.
2015-05-06Get rid of deprecated_init_ui_hookJoel Brobecker5-22/+11
This hook is no longer used, and can therefore be eliminated. gdb/ChangeLog: * defs.h (deprecated_init_ui_hook): Delete. Remove associated comment. * top.c (deprecated_init_ui_hook): Delete. (gdb_init): Remove handling of deprecated_init_ui_hook. * interps.c (clear_interpreter_hooks): Remove handling of deprecated_init_ui_hook. * main.c (captured_main): Update comment.
2015-05-06Make the "info dll" command available on all platform.Joel Brobecker6-11/+22
The "info dll", an alias of the "info sharedlibrary" command, is currently only defined in windows native versions. This patch makes it universally available by moving the alias declaration to solib.c, and adjusts the documentation accordingly. Making it universally available has two benefits: - Windows users moving to a Unix platforms are still able to use the same command for getting the list of shared libraries; - Unix to Windows cross debuggers now provide that command also. gdb/ChangeLog: * solib.c (_initialize_solib): Add "info dll" alias creation. * windows-nat.c (set_windows_aliases): Delete. (_initialize_windows_nat): Remove deprecated_init_ui_hook assignment. * NEWS: Add news entry about "info dll" now being available on all platforms. gdb/doc/ChangeLog: * gdb.texinfo (Files): Add "info dll" documentation. (Cygwin Native): Remove "info dll" documentation.
2015-05-05Further document ada-lang.c::value_assign_to_component & fix whitespaces.Joel Brobecker2-11/+22
This patch improves the documentation of ada-lang.c's value_assign_to_component to publish the fact that it also works with not_lval values. And touching this area of the code showed that there were a number of whitespace issues, as well as a formatting issue of the main comment (no leading '*' on each line). This patch fixes those while at it. No functional change, however. gdb/ChangeLog: * ada-lang.c (value_assign_to_component): Reformat and improve documentation. Remove all trailing spaces.
2015-05-05out of line functions nested inside inline functions.Joel Brobecker4-0/+27
This patch improves the handling of out-of-line functions nested inside functions that have been inlined. Consider for instance a situation where function Foo_O224_021 has a function Child1 declared in it, which itself has a function Child2 nested inside Child1. After compiling the program with optimization on, Child1 gets inlined, but not Child2. After inserting a breakpoint on Child2, and running the program until reaching that breakpoint, we get the following backtrace: % gdb foo_o224_021 (gdb) break foo_o224_021.child1.child2 (gdb) run [...] Breakpoint 1, foo_o224_021 () at foo_o224_021.adb:28 28 Child1; (gdb) bt #0 0x0000000000402400 in foo_o224_021 () at foo_o224_021.adb:28 #1 0x00000000004027a4 in foo_o224_021.child1 () at foo_o224_021.adb:23 #2 0x00000000004027a4 in foo_o224_021 () at foo_o224_021.adb:28 GDB reports the wrong function name for frame #0. We also get the same kind of error in the "Breakpoint 1, foo_o224_021 () [...]" message. In both cases, the function name should be foo_o224_021.child1.child2, and the parameters should be "s=...". What happens is that the inlined frame handling does not handle well the case where an inlined function is calling an out-of-line function which was declared inside the inlined function's scope. In particular, looking first at the inlined-frame sniffer when applying to frame #0: /* Calculate DEPTH, the number of inlined functions at this location. */ depth = 0; cur_block = frame_block; while (BLOCK_SUPERBLOCK (cur_block)) { if (block_inlined_p (cur_block)) depth++; cur_block = BLOCK_SUPERBLOCK (cur_block); } What happens is that cur_block starts as the block associated to child2, which is not inlined. We shoud be stopping here, but instead, we keep walking the superblock chain, which takes us all the way to Foo_O224_021's block, via Child2's block. And since Child1 was inlined, we end up with a depth count of 1, wrongly making GDB think that frame #0 is an inlined frame. Same kind of issue inside skip_inline_frames. The fix is to stop checking for inlined frames as soon as we see a block corresponding to a function which is not inlined. This is the behavior we now obtain: (gdb) run [...] Breakpoint 1, foo_o224_021.child1.child2 (s=...) at foo_o224_021.adb:9 9 function Child2 (S : String) return Boolean is (gdb) bt #0 0x0000000000402400 in foo_o224_021.child1.child2 (s=...) at foo_o224_021.adb:9 #1 0x00000000004027a4 in foo_o224_021.child1 () at foo_o224_021.adb:23 #2 0x00000000004027a4 in foo_o224_021 () at foo_o224_021.adb:28 gdb/ChangeLog: * inline-frame.c (inline_frame_sniffer, skip_inline_frames): Stop counting inlined frames as soon as an out-of-line function is found. gdb/testsuite/ChangeLog: * gdb.ada/out_of_line_in_inlined.exp: Add run and "bt" tests.
2015-05-05DWARF: cannot break on out-of-line function nested inside inlined function.Pierre-Marie de Rodat7-6/+159
Consider the following code, which defines a function, Child2, which is itself nested inside Child1: procedure Foo_O224_021 is O1 : constant Object_Type := Get_Str ("Foo"); procedure Child1 is O2 : constant Object_Type := Get_Str ("Foo"); function Child2 (S : String) return Boolean is -- STOP begin for C of S loop Do_Nothing (C); if C = 'o' then return True; end if; end loop; return False; end Child2; R : Boolean; begin R := Child2 ("Foo"); R := Child2 ("Bar"); R := Child2 ("Foobar"); end Child1; begin Child1; end Foo_O224_021; On x86_64-linux, when compiled at -O2, GDB is unable to insert a breakpoint on Child2: % gnatmake -g -O2 foo_o224_021 % gdb foo_o224_021 (gdb) b child2 Function "child2" not defined. (gdb) b foo_o224_021.child1.child2 Function "foo_o224_021.child1.child2" not defined. The problem is caused by the fact that GDB did not create a symbol for Child2, and this, in turn, is caused by the fact that the compiler decided to inline Child1, but not Child2. The DWARF debugging info first provides an abstract instance tree for Child1... <3><1b7b>: Abbrev Number: 29 (DW_TAG_subprogram) <1b7c> DW_AT_name : (indirect string, offset: 0x23f8): foo_o224_021__child1 <1b82> DW_AT_inline : 1 (inlined) <1b83> DW_AT_sibling : <0x1c01> ... where that subprogram is given the DW_AT_inline attribute. Inside that function there is a lexical block which has no PC range (corresponding to the fact that this is the abstract tree): <4><1b87>: Abbrev Number: 30 (DW_TAG_lexical_block) ... inside which our subprogram Child2 is described: <5><1b92>: Abbrev Number: 32 (DW_TAG_subprogram) <1b93> DW_AT_name : (indirect string, offset: 0x2452): foo_o224_021__child1__child2 <1b99> DW_AT_type : <0x1ab1> <1b9d> DW_AT_low_pc : 0x402300 <1ba5> DW_AT_high_pc : 0x57 [...] Then, later on, we get the concrete instance tree, starting at: <3><1c5e>: Abbrev Number: 41 (DW_TAG_inlined_subroutine) <1c5f> DW_AT_abstract_origin: <0x1b7b> <1c63> DW_AT_entry_pc : 0x4025fd <1c6b> DW_AT_ranges : 0x150 ... which refers to Child1. One of that inlined subroutine children is the concrete instance of the empty lexical block we saw above (in the abstract instance tree), which gives the actual address range for this inlined instance: <5><1c7a>: Abbrev Number: 43 (DW_TAG_lexical_block) <1c7b> DW_AT_abstract_origin: <0x1b87> <1c7f> DW_AT_ranges : 0x180 This is the DIE which provides the context inside which we can record Child2. But unfortunately, GDB does not take the abstract origin into account when handling lexical blocks, causing it to miss the fact that this block contains some symbols described in the abstract instance tree. This is the first half of this patch: modifying GDB to follow DW_AT_abstract_origin attributes for lexical blocks. But this not enough to fix the issue, as we're still unable to break on Child2 with just that change. The second issue can be traced to the way inherit_abstract_dies determines the list of DIEs to inherit from. For that, it iterates over all the DIEs in the concrete instance tree, and finds the list of DIEs from the abstract instance tree that are not referenced from the concrete instance tree. As it happens, there is one type of DIE in the concrete instance tree which does reference Child2's DIE, but in fact does otherwise define a concrete instance of the reference DIE; that's (where <0x1b92> is Child2's DIE): <6><1d3c>: Abbrev Number: 35 (DW_TAG_GNU_call_site) <1d3d> DW_AT_low_pc : 0x4026a4 <1d45> DW_AT_abstract_origin: <0x1b92> So, the second part of the patch is to modify inherit_abstract_dies to ignore DW_TAG_GNU_call_site DIEs when iterating over the concrete instance tree. This patch also includes a testcase which can be used to reproduce the issue. Unfortunately, for it to actually pass, a smal patch in GCC is also necessary to make sure that GCC provides lexical blocks' DW_AT_abstract_origin attributes from the concrete tree back to the abstract tree. We hope to be able to submit and integrate that patch in the GCC tree soon. Meanwhile, a setup_xfail has been added. gdb/ChangeLog: 2014-05-05 Pierre-Marie de Rodat <derodat@adacore.com> * dwarf2read.c (inherit_abstract_dies): Skip DW_TAG_GNU_call_site dies while inheriting children of an abstract DIE into a scope. (read_lexical_block_scope): Inherit abstract DIE's for lexical scopes. gdb/testsuite/ChangeLog: * gdb.ada/out_of_line_in_inlined: New testcase.
2015-05-05compare object sizes before comparing them with value_contents_eqJoel Brobecker3-3/+16
This is an issue which I noticed while working on trying to print an array of variant records. For instance, trying to print "A1", an array of elements whose size is variable, defined as follow (see gdb.ada/var_rec_arr testcase): subtype Small_Type is Integer range 0 .. 10; type Record_Type (I : Small_Type := 0) is record S : String (1 .. I); end record; function Ident (R : Record_Type) return Record_Type; type Array_Type is array (Integer range <>) of Record_Type; A1 : Array_Type := (1 => (I => 0, S => <>), 2 => (I => 1, S => "A"), 3 => (I => 2, S => "AB")); The debugger sometimes prints the array as follow: (gdb) print A1 $1 = ((i => 0, s => ""), (i => 0, s => ""), (i => 0, s => "")) The problem happens inside the part of the loop printing the array's elements, while trying to count the number of consecutive elements that have the same value (in order to replace them by the "<repeats nnn times>" message when the number exceeds a threshold). In particular, in ada-valprint.c::val_print_packed_array_elements: elttype = TYPE_TARGET_TYPE (type); eltlen = TYPE_LENGTH (check_typedef (elttype)); while (...) { if (!value_contents_eq (v0, value_embedded_offset (v0), v1, value_embedded_offset (v1), eltlen)) break; The value comparison is performed using value_contents_eq but makes the assumption that elttype is not dynamic, which is not always true. In particular, in the case above, elttype is dynamic and therefore its TYPE_LENGTH changes from element to element. As it happens in this case, the eltlen is zero, which causes the call to value_contents_eq to return true, and therefore GDB thinks all 3 elements of the array are equal. This patch fixes the issue by making sure that both v0 and v1, which are values whose type we expect to be resolved, have identical lengths. If not, then the two elements of the array cannot possibly have the same value and we do not even need to do the binary comparison. Unfortunately, this is still not enough to get GDB to print the correct value for our array, because the assumption that v0 and v1 have a type which has been resolved is actually not met. So, the second part of the patch modifies the function that constructed the values to make sure dynamic types do get resolved. gdb/ChangeLog: * ada-valprint.c (val_print_packed_array_elements): Delete variable "len". Add a type-length check when comparing two consecutive elements of the array. Use the element's actual length in call to value_contents_eq. * ada-lang.c (ada_value_primitive_packed_val): Always return a value whose type has been resolved.
2015-05-05testsuite/gdb.ada/var_rec_arr: New testcase.Joel Brobecker5-0/+144
gdb/testsuite/ChangeLog: * gdb.ada/var_rec_arr: New testcase.
2015-05-05GDB crash trying to subscript array of variant record.Joel Brobecker2-0/+17
Consider the following declarations: subtype Small_Type is Integer range 0 .. 10; type Record_Type (I : Small_Type := 0) is record S : String (1 .. I); end record; A2 : Array_Type := (1 => (I => 2, S => "AB"), 2 => (I => 1, S => "A"), 3 => (I => 0, S => <>)); Compiled with -fgnat-encodings=minimal, and trying to print one element of our array, valgrind reports an invalid memory access. On certain GNU/Linux boxes, malloc even reports it as well, and causes GDB to crash. (gdb) print a2(1) *** glibc detected *** /[...]/gdb: malloc(): memory corruption: 0x0a30ba48 *** [crash] The invalid memory access occurs because of a simple buffer overflow in ada_value_primitive_packed_val. When this function is called, it is given a bit_size of 128 (or 16 bytes), which corresponds to the stride of our array. But the actual size of each element depends on its value. In particular, A2(1) is a record whose size is only 6 bytes. What happens in our example is that we start building a new value (v) where the element is to be unpacked, with any of its dynamic properties getting resolved as well. We then unpack the data into this value's buffer: unpacked = (unsigned char *) value_contents (v); [...] nsrc = len; [...] while (nsrc > 0) { [...] unpacked[targ] = accum & ~(~0L << HOST_CHAR_BIT); [...] targ += delta; [...] nsrc -= 1; [...] } In the loop above, targ starts at zero (for LE architectures), and len is 16. With delta being +1, we end up iterating 16 times, writing 16 bytes into a 6-bytes buffer. This patch fixes the issue by adjusting BIT_SIZE and recomputing LEN after having resolved our type if the resolved type turns out to be smaller than bit_size. gdb/ChangeLog: * ada-lang.c (ada_value_primitive_packed_val): Recompute BIT_SIZE and LEN if the size of the resolved type is smaller than BIT_SIZE * HOST_CHAR_BIT.
2015-05-05[Ada] array of variant record subscriptingJoel Brobecker2-2/+8
Consider the following (Ada) array... A1 : Array_Type := (1 => (I => 0, S => <>), 2 => (I => 1, S => "A"), 3 => (I => 2, S => "AB")); ... where Array_Type is declared as follow: subtype Small_Type is Integer range 0 .. 10; type Record_Type (I : Small_Type := 0) is record S : String (1 .. I); end record; type Array_Type is array (Integer range <>) of Record_Type; Trying to print the value of each element individually does not always work. Printing the value of the first one does: (gdb) p a1(1) $1 = (i => 0, s => "") But printing the value of the subsequent ones often does not. For instance: (gdb) p a1(2) $2 = (i => 1, s => "") <<<--- s should be "A" (gdb) p a1(3) $3 = (i => 2, s => "") <<<--- s should be "AB" I traced the problem to ada_value_primitive_packed_val, which is trying to perform the array subscripting by extracting the value of the corresponding array element into a buffer where the contents is now byte-aligned. The element type that ada_value_primitive_packed_val gets passed is a dynamic type. As it happens, that dynamic type can get resolved thanks to: v = value_at (type, value_address (obj)); type = value_type (v); However, obj represents the array, so the address given in the call to value_at represents the value of the first element. As a result, the solution of component S's upper bound always gets resolved based on the value of component I in the first element of the array, whose value is 0, thus leading to GDB mistakely resolving the element type where S's upper bound is always 0. The proper fix would be to systematically resolve the element type first. But, this requires us to extract-and-realign the element's value so as to be able to pass it as "valaddr" to resolve_dynamic_type. In the meantime, it's easy to make the situation a little better by passing "value_address (obj) + offset" as the object address. This only works when BIT_OFFSET is nul, but that should be the case when the element type is anything but a scalar, which seems to be the only situation where it seems important to resolve the type now. And we're not that worse off otherwise. But we'll try to find a better solution in a separate patch. gdb/ChangeLog: * ada-lang.c (ada_value_primitive_packed_val): Use a more correct address in call to value_at. Adjust call to value_address accordingly.
2015-05-05[Ada] Resolve dynamic type before trying to print it.Joel Brobecker2-0/+7
This is another required step towards trying to print the value of an array of variant records. For instance: A1 : Array_Type := (1 => (I => 0, S => <>), 2 => (I => 1, S => "A"), 3 => (I => 2, S => "AB")); ... where Array_Type is an array of records whose size is variable: subtype Small_Type is Integer range 0 .. 10; type Record_Type (I : Small_Type := 0) is record S : String (1 .. I); end record; type Array_Type is array (Integer range <>) of Record_Type; What happens is that the ada-valprint modules gets passed an array whose element type is not resolved yet (since each element of the array needs to be resolved separately). the module then recurses, and eventually gets called with the first element of the array. But because the element hasn't been resolved yet, we end up having trouble printing its value soon after. This patch fixes the issue by calling resolve_dynamic_type before trying to print it. With this patch, GDB is finally able to print the complete value for variable "A1": (gdb) p a1 $1 = ((i => 0, s => ""), (i => 1, s => "A"), (i => 2, s => "AB")) gdb/ChangeLog: * ada-valprint.c (ada_val_print_1): Resolve TYPE before trying to print it.
2015-05-05Add valaddr support in dynamic property resolution.Joel Brobecker8-11/+45
This is the second part of enhancing the debugger to print the value of arrays of records whose size is variable when only standard DWARF info is available (no GNAT encoding). For instance: subtype Small_Type is Integer range 0 .. 10; type Record_Type (I : Small_Type := 0) is record S : String (1 .. I); end record; type Array_Type is array (Integer range <>) of Record_Type; A1 : Array_Type := (1 => (I => 0, S => <>), 2 => (I => 1, S => "A"), 3 => (I => 2, S => "AB")); Currently, GDB prints the following output: (gdb) p a1 $1 = ( The error happens while the ada-valprint module is trying to print the value of an element of our array. Because of the fact that the array's element (type Record_Type) has a variant size, the DWARF info for our array provide the array's stride: <1><749>: Abbrev Number: 10 (DW_TAG_array_type) <74a> DW_AT_name : (indirect string, offset: 0xb6d): pck__T18s <74e> DW_AT_byte_stride : 16 <74f> DW_AT_type : <0x6ea> And because our array has a stride, ada-valprint treats it the same way as packed arrays (see ada-valprint.c::ada_val_print_array): if (TYPE_FIELD_BITSIZE (type, 0) > 0) val_print_packed_array_elements (type, valaddr, offset_aligned, 0, stream, recurse, original_value, options); The first thing that we should notice in the call above is that the "valaddr" buffer and the associated offset (OFFSET_ALIGNED) is passed, but that the corresponding array's address is not. This can be explained by looking inside val_print_packed_array_elements, where we see that the function unpacks each element of our array from the buffer alone (ada_value_primitive_packed_val), and then prints the resulting artificial value instead: v0 = ada_value_primitive_packed_val (NULL, valaddr + offset, (i0 * bitsize) / HOST_CHAR_BIT, (i0 * bitsize) % HOST_CHAR_BIT, bitsize, elttype); [...] val_print (elttype, value_contents_for_printing (v0), value_embedded_offset (v0), 0, stream, recurse + 1, v0, &opts, current_language); Of particular interest, here, is the fact that we call val_print with a null address, which is OK, since we're providing a buffer instead (value_contents_for_printing). Also, providing an address might not always possible, since packing could place elements at boundaries that are not byte-aligned. Things go south when val_print tries to see if there is a pretty-printer that could be applied. In particular, one of the first things that the Python pretty-printer does is to create a value using our buffer, and the given address, which in this case is null (see call to value_from_contents_and_address in gdbpy_apply_val_pretty_printer). value_from_contents_and_address, in turn immediately tries to resolve the type, using the given address, which is null. But, because our array element is a record containing an array whose bound is the value of one of its elements (the "s" component), the debugging info for the array's upper bound is a reference... <3><71a>: Abbrev Number: 7 (DW_TAG_subrange_type) <71b> DW_AT_type : <0x724> <71f> DW_AT_upper_bound : <0x703> ... to component "i" of our record... <2><703>: Abbrev Number: 5 (DW_TAG_member) <704> DW_AT_name : i <706> DW_AT_decl_file : 2 <707> DW_AT_decl_line : 6 <708> DW_AT_type : <0x6d1> <70c> DW_AT_data_member_location: 0 ... where that component is located at offset 0 of the start of the record. dwarf2_evaluate_property correctly determines the offset where to load the value of the bound from, but then tries to read that value from inferior memory using the address that was given, which is null. See case PROP_ADDR_OFFSET in dwarf2_evaluate_property: val = value_at (baton->offset_info.type, pinfo->addr + baton->offset_info.offset); This triggers a memory error, which then causes the printing to terminate. Since there are going to be situations where providing an address alone is not going to be sufficient (packed arrays where array elements are not stored at byte boundaries), this patch fixes the issue by enhancing the type resolution to take both address and data. This follows the same principle as the val_print module, where both address and buffer ("valaddr") can be passed as arguments. If the data has already been fetched from inferior memory (or provided by the debugging info in some form -- Eg a constant), then use that data instead of reading it from inferior memory. Note that this should also be a good step towards being able to handle dynamic types whose value is stored outside of inferior memory (Eg: in a register). With this patch, GDB isn't able to print all of A1, but does perform a little better: (gdb) p a1 $1 = ((i => 0, s => , (i => 1, s => , (i => 2, s => ) There is another issue which is independent of this one, and will therefore be patched separately. gdb/ChangeLog: * dwarf2loc.h (struct property_addr_info): Add "valaddr" field. * dwarf2loc.c (dwarf2_evaluate_property): Add handling of pinfo->valaddr. * gdbtypes.h (resolve_dynamic_type): Add "valaddr" parameter. * gdbtypes.c (resolve_dynamic_struct): Set pinfo.valaddr. (resolve_dynamic_type_internal): Set pinfo.valaddr. Add handling of addr_stack->valaddr. (resolve_dynamic_type): Add "valaddr" parameter. Set pinfo.valaddr field. * ada-lang.c (ada_discrete_type_high_bound): Update call to resolve_dynamic_type. (ada_discrete_type_low_bound): Likewise. * findvar.c (default_read_var_value): Likewise. * value.c (value_from_contents_and_address): Likewise.
2015-05-05preserve the bit stride when resolving an array type.Joel Brobecker2-3/+8
Consider the following (Ada) variable... A1 : Array_Type := (1 => (I => 0, S => <>), 2 => (I => 1, S => "A"), 3 => (I => 2, S => "AB")); ... where Array_Type is an array of records whose size is variable: subtype Small_Type is Integer range 0 .. 10; type Record_Type (I : Small_Type := 0) is record S : String (1 .. I); end record; type Array_Type is array (Integer range <>) of Record_Type; Trying to print the value of this array currently results in the following error: (gdb) p a1 Cannot access memory at address 0x61c000 What happens in this case, is that the compiler describes our array as an array with a specific stride (and bounds being static 1..3): <1><749>: Abbrev Number: 10 (DW_TAG_array_type) <74a> DW_AT_name : (indirect string, offset: 0xb6d): pck__T18s <74e> DW_AT_byte_stride : 16 <74f> DW_AT_type : <0x6ea> <2><757>: Abbrev Number: 11 (DW_TAG_subrange_type) <758> DW_AT_type : <0x75e> <75c> DW_AT_upper_bound : 3 This is because we cannot use, in this case, the size of the record to determine that stride, since the size of the record depends on its contents. So the compiler helps us by providing that stride. The problems start when trying to resolve that type. Because the elements contained in that array type are dynamic, the array itself is considered dynamic, and thus we end up creating a resolved version of that array. And during that resolution, we were not handling the case where the array had a stride. See gdbtypes.c::resolve_dynamic_array... return create_array_type (copy_type (type), elt_type, range_type); As a result, we created an array whose stride was based on the size of elt_type, which a record whose size isn't static and irrelevant regardless. This patch fixes is by calling create_array_type_with_stride instead. As it happens, there is another issue for us to be able to print the value of our array, but those are independent of this patch and will be handled separately. For now, the patch allows us to get rid of the first error, and the output is now: (gdb) p a1 $1 = ( gdb/ChangeLog: * gdbtypes.c (resolve_dynamic_array): Use create_array_type_with_stride instead of create_array_type.
2015-04-30Make RL78 disassembler and simulator respect ISA for mul/divDJ Delorie2-1/+6
[gas] * config/rl78-defs.h (rl78_isa_g10): New. (rl78_isa_g13): New. (rl78_isa_g14): New. * config/rl78-parse.y (ISA_G10): New. (ISA_G13): New. (ISA_G14): New. (MULHU, MULH, MULU, DIVHU, DIVWU, MACHU, MACH): Use them. * config/tc-rl78.c (rl78_isa_g10): New. (rl78_isa_g13): New. (rl78_isa_g14): New. [gdb] * rl78-tdep.c (rl78_analyze_prologue): Pass RL78_ISA_DEFAULT to rl78_decode_opcode [include] * dis-asm.h (print_insn_rl78_g10): New. (print_insn_rl78_g13): New. (print_insn_rl78_g14): New. (rl78_get_disassembler): New. * opcode/rl78.h (RL78_Dis_Isa): New. (rl78_decode_opcode): Add ISA parameter. [opcodes] * disassemble.c (disassembler): Choose suitable disassembler based on E_ABI. * rl78-decode.opc (rl78_decode_opcode): Take ISA parameter. Use it to decode mul/div insns. * rl78-decode.c: Regenerate. * rl78-dis.c (print_insn_rl78): Rename to... (print_insn_rl78_common): ...this, take ISA parameter. (print_insn_rl78): New. (print_insn_rl78_g10): New. (print_insn_rl78_g13): New. (print_insn_rl78_g14): New. (rl78_get_disassembler): New. [sim] * rl78/cpu.c (g14_multiply): New. * rl78/cpu.h (g14_multiply): New. * rl78/load.c (rl78_load): Decode ISA completely. * rl78/main.c (main): Expand -M to include other ISAs. * rl78/rl78.c (decode_opcode): Decode based on ISA. * rl78/trace.c (rl78_disasm_fn): New. (sim_disasm_init): Reset it. (sim_disasm_one): Get correct disassembler for ISA.
2015-04-30Skip setting HW watchpoint if skip_hw_watchpoint_multi_tests in ↵Yao Qi2-1/+8
gdb.base/break-idempotent.exp Hi, I see this fails below on arm linux native testing and remote testing with "set remote hardware-watchpoint-limit 1", rwatch global^M There are not enough available hardware resources for this watchpoint.^M (gdb) FAIL: gdb.base/break-idempotent.exp: always-inserted off: rwatch: twice: rwatch global gdb.base/break-idempotent.exp sets two breakpoints/watchpoints on the same address. GDB isn't smart enough calculate these two HW watchpoints can fit in one HW debug register, so the error message above isn't necessary (there is one HW watchpoint register on arm). Because target_ops interface can_use_hardware_watchpoint doesn't pass enough information to the target backend. Note that if I don't "set remote hardware-watchpoint-limit 1" in remote testing, this test passes without fails. However without "set remote hardware-watchpoint-limit 1", many other watchpoint tests fail. This patch is to add a check to skip_hw_watchpoint_multi_tests for rwatch and awatch. We can add such check for watch as well, but GDB is able to switch to software watchpoint if HW resource isn't available, it doesn't cause any fail, I decide not to skip. gdb/testsuite: 2015-04-30 Yao Qi <yao.qi@linaro.org> * gdb.base/break-idempotent.exp: If skip_hw_watchpoint_multi_tests returns true, skip the tests on "rwatch" and "awatch".
2015-04-30Skip gdb.base/relativedebug.exp if libc doesn't have debug infoYao Qi2-0/+17
Hi, I see the fail in gdb.base/relativedebug.exp on aarch64 box on which glibc doesn't have debug info, bt^M #0 0x0000002000061a88 in raise () from /lib/aarch64-linux-gnu/libc.so.6^M #1 0x0000002000064efc in abort () from /lib/aarch64-linux-gnu/libc.so.6^M #2 0x0000000000400640 in handler (signo=14) at ../../../binutils-gdb/gdb/testsuite/gdb.base/relativedebug.c:25^M #3 <signal handler called>^M #4 0x00000020000cc478 in ?? () from /lib/aarch64-linux-gnu/libc.so.6^M #5 0x0000000000400664 in main () at ../../../binutils-gdb/gdb/testsuite/gdb.base/relativedebug.c:32^M (gdb) FAIL: gdb.base/relativedebug.exp: pause found in backtrace if glibc has debug info, this test doesn't fail. In sysdeps/unix/sysv/linux/generic/pause.c, __libc_pause calls __syscall_pause, static int __syscall_pause (void) { sigset_t set; int rc = INLINE_SYSCALL (rt_sigprocmask, 4, SIG_BLOCK, NULL, &set, _NSIG / 8); if (rc == 0) rc = INLINE_SYSCALL (rt_sigsuspend, 2, &set, _NSIG / 8); return rc; } int __libc_pause (void) { if (SINGLE_THREAD_P) return __syscall_pause (); <--- tail call int oldtype = LIBC_CANCEL_ASYNC (); int result = __syscall_pause (); LIBC_CANCEL_RESET (oldtype); return result; } and GDB unwinder is confused by the GCC optimized code, (gdb) disassemble pause Dump of assembler code for function pause: 0x0000007fb7f274c4 <+0>: stp x29, x30, [sp,#-32]! 0x0000007fb7f274c8 <+4>: mov x29, sp 0x0000007fb7f274cc <+8>: adrp x0, 0x7fb7fd2000 0x0000007fb7f274d0 <+12>: ldr w0, [x0,#364] 0x0000007fb7f274d4 <+16>: stp x19, x20, [sp,#16] 0x0000007fb7f274d8 <+20>: cbnz w0, 0x7fb7f274e8 <pause+36> 0x0000007fb7f274dc <+24>: ldp x19, x20, [sp,#16] 0x0000007fb7f274e0 <+28>: ldp x29, x30, [sp],#32 0x0000007fb7f274e4 <+32>: b 0x7fb7f27434 <---- __syscall_pause 0x0000007fb7f274e8 <+36>: bl 0x7fb7f5e080 Note that the program stops in __syscall_pause, but its symbol is stripped in glibc, so GDB doesn't know where the program stops. __syscall_pause is a tail call in __libc_pause, so it returns to main instead of __libc_pause. As a result, the backtrace is like, #0 0x0000007fb7ebca88 in raise () from /lib/aarch64-linux-gnu/libc.so.6 #1 0x0000007fb7ebfefc in abort () from /lib/aarch64-linux-gnu/libc.so.6 #2 0x0000000000400640 in handler (signo=14) at ../../../binutils-gdb/gdb/testsuite/gdb.base/relativedebug.c:25 #3 <signal handler called> #4 0x0000007fb7f27478 in ?? () from /lib/aarch64-linux-gnu/libc.so.6 <-- [in __syscall_pause] #5 0x0000000000400664 in main () at ../../../binutils-gdb/gdb/testsuite/gdb.base/relativedebug.c:32 looks GDB does nothing wrong here. I looked back at the test case gdb.base/relativedebug.exp, which was added https://sourceware.org/ml/gdb-patches/2006-10/msg00305.html This test was indented to test the problem that "backtraces no longer display some libc functions" after separate debug info is installed. IOW, it makes few sense to test against libc which doesn't have debug info at all, such as my case. This patch is to tweak the test case to catch the output of "info shared", if "(*)" is found for libc.so, which means libc doesn't have debug info, then skip the test. gdb/testsuite: 2015-04-30 Yao Qi <yao.qi@linaro.org> * gdb.base/relativedebug.exp: Invoke gdb command "info sharedlibrary", and if libc.so doesn't have debug info, skip the test.
2015-04-29PR python/18285Doug Evans18-28/+304
gdb/ChangeLog: PR python/18285 * NEWS: Document new gdb.XMethodWorker.get_result_type method. * eval.c (evaluate_subexp_standard) <OP_FUNCALL>: Handle EVAL_AVOID_SIDE_EFFECTS for xmethods. * extension-priv.h (struct extension_language_ops) <get_xmethod_result_type>: New member. * extension.c (get_xmethod_result_type): New function. * extension.h (get_xmethod_result_type): Declare. * python/py-xmethods.c (get_result_type_method_name): New static global. (py_get_result_type_method_name): Ditto. (gdbpy_get_xmethod_result_type): New function. (gdbpy_initialize_xmethods): Initialize py_get_result_type_method_name. * python/python-internal.h (gdbpy_get_xmethod_result_type): Declare. * python/python.c (python_extension_ops): Add gdbpy_get_xmethod_result_type. * python/lib/gdb/xmethod.py (XMethodWorker): Add get_result_type. * valarith.c (value_x_binop): Handle EVAL_AVOID_SIDE_EFFECTS for xmethods. (value_x_unop): Ditto. * value.c (result_type_of_xmethod): New function. * value.h (result_type_of_xmethod): Declare. gdb/testsuite/ChangeLog: * gdb.python/py-xmethods.exp: Add ptype tests. * gdb.python/py-xmethods.py (E_method_char_worker): Add get_result_type method. gdb/doc/ChangeLog: * python.texi (Xmethod API) <gdb.XMethodWorker.get_result_type>: Document. (Writing an Xmethod): Add get_result_type to example.
2015-04-29Use software watchpoints if hardware watchpoints are not available when ↵Luis Machado2-0/+10
testing gdb.base/watch-bitfields.exp There are targets GDB thinks support hardware watchpoints, but in reality they don't. Though it may seem that hardware watchpoint creation was successful, the actual insertion of such watchpoint will fail when GDB moves the inferior. (gdb) watch -location q.a^M Hardware watchpoint 2: -location q.a^M (gdb) PASS: gdb.base/watch-bitfields.exp: -location watch against bitfields: watch -location q.a watch -location q.e^M Hardware watchpoint 3: -location q.e^M (gdb) PASS: gdb.base/watch-bitfields.exp: -location watch against bitfields: watch -location q.e print q.a^M $1 = 0^M (gdb) PASS: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: print expression before continue^M Continuing.^M Warning:^M Could not insert hardware watchpoint 2.^M Could not insert hardware watchpoint 3.^M Could not insert hardware breakpoints:^M You may have requested too many hardware breakpoints/watchpoints.^M ^M (gdb) FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: continue This leads to a number of FAILs: FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: continue FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 0->1: print expression after FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 0->5: continue FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 0->5: print expression after FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 1->0: print expression before FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.a: 1->0: continue FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 5->4: print expression before FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 5->4: continue FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q.e: 5->4: print expression after FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: continue until exit FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 0->4: continue FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 0->4: print expression after FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 4->10: print expression before FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 4->10: continue FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 4->10: print expression after FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 10->3: print expression before FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 10->3: continue FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 10->3: print expression after FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 3->2: print expression before FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 3->2: continue FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 3->2: print expression after FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 2->1: print expression before FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 2->1: continue FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 2->1: print expression after FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 1->0: print expression before FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: q.d + q.f + q.g: 1->0: continue FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: continue until exit We can avoid these errors/FAILs by checking the board data and switching to software watchpoints if the board does not support hardware watchpoints. gdb/testsuite/ChangeLog: 2015-04-29 Luis Machado <lgustavo@codesourcery.com> * gdb.base/watch-bitfields.exp: Switch to software watchpoints if the target does not support hardware watchpoints.
2015-04-29Handle memory write errors on gdb.base/break-always.expLuis Machado2-13/+24
This is another case of the testcase not handling memory write errors that happen on some targets (QEMU) when GDB attempts to modify an address that should contain a breakpoint, for example. The following patch handles this and prevents spurious failures from happening. It also adds a foreach loop to avoid duplication of code and hardcoded patterns. gdb/testsuite/ChangeLog: 2015-04-29 Luis Machado <lgustavo@codesourcery.com> * gdb.base/break-always.exp: Abort testing if writing to memory causes an error.
2015-04-29Allow passing fd == NULL to exec_file_find and solib_findGary Benson4-21/+29
This commit allows NULL to be passed as the int *fd argument to exec_file_find and solib_find to simplify use cases where the caller does not require the file to be opened. gdb/ChangeLog: * solib.c (solib_find_1): Allow fd argument to be NULL. (exec_file_find): Update comment. (solib_find): Likewise. * exec.c (exec_file_locate_attach): Use NULL as fd argument to exec_file_find to avoid having to close the opened file. * infrun.c (follow_exec): Likewise.
2015-04-28PR python/18299Doug Evans7-14/+273
gdb/ChangeLog: PR python/18299 * python/lib/gdb/printing.py (register_pretty_printer): Handle name or __name__ attributes. Handle gdb module as first argument. gdb/testsuite/ChangeLog: * gdb.python/py-pp-maint.py: Move "replace" testing to ... * gdb.python/py-pp-registration.exp: ... here. New file. * gdb.python/py-pp-registration.c: New file. * gdb.python/py-pp-registration.py: New file.
2015-04-28PR python/18089Doug Evans8-0/+228
gdb/ChangeLog: PR python/18089 * python/py-prettyprint.c (print_children): Verify result of children iterator. Provide better error message. * python/python-internal..h (gdbpy_print_python_errors_p): Declare. * python/python.c (gdbpy_print_python_errors_p): New function. gdb/testsuite/ChangeLog: * gdb.python/py-bad-printers.c: New file. * gdb.python/py-bad-printers.py: New file. * gdb.python/py-bad-printers.exp: New file.
2015-04-28* gdbtypes.h (struct cplus_struct_type) <n_baseclasses>: Fix comment.Doug Evans2-2/+6
gdb/ChangeLog: * gdbtypes.h (struct cplus_struct_type) <n_baseclasses>: Fix comment.
2015-04-28Add gdb.Type.optimized_out method.Sasha Smundak7-0/+36
gdb/ChangeLog: * NEWS: Mention gdb.Type.optimized_out method. * python/py-type.c (typy_optimized_out): New function. gdb/doc/ChangeLog: * python.texi: New method documented. gdb/testsuite/ChangeLog: * gdb.python/py-type.exp: New test.
2015-04-28Use "gdb_wait.h" instead of <sys/wait.h>.John Baldwin2-1/+5
gdb/ChangeLog: * fbsd-nat.c: Include "gdb_wait.h" instead of <sys/wait.h>.
2015-04-28Disable readline's SIGWINCH handlerPatrick Palka3-2/+11
We no longer need it as we handle SIGWINCH ourselves. Also move the call to init_page_info() from initialize_utils() to the latter function's only caller, gdb_init(). gdb/ChangeLog: * utils.c (init_page_info): Set rl_catch_sigwinch to zero. (initialize_utils): Move call of init_page_info() to ... * top.c (gdb_init): ... here.
2015-04-28Update our idea of our terminal's dimensions even outside of TUIPatrick Palka2-13/+24
When in the CLI, GDB's "width" and "height" variables are not kept in sync when the underlying terminal gets resized. This patch fixes this issue by making sure sure to update GDB's "width" and "height" variables in the !tui_active case of our SIGWINCH handler. gdb/ChangeLog: * tui/tui-win.c (tui_sigwinch_handler): Remove now-stale comment. (tui_sigwinch_handler): Still update our idea of the terminal's width and height even when TUI is not active.
2015-04-28Introduce function for directly updating GDB's screen dimensionsPatrick Palka4-9/+36
... to replace the roundabout pattern of execute_command ("set width %d"); execute_command ("set height %d"); for doing the same thing. gdb/ChangeLog: * utils.h (set_screen_width_and_height): Declare. * utils.c (set_screen_width_and_height): Define. * tui/tui-win.c (tui_update_gdb_sizes): Use it.
2015-04-28Use exec_file_find to prepend gdb_sysroot in follow_execGary Benson2-7/+17
This commit updates follow_exec to use exec_file_find to prefix the new executable's filename with gdb_sysroot rather than doing it longhand. gdb/ChangeLog: * infrun.c (solist.h): New include. (follow_exec): Use exec_file_find to prefix execd_pathname with gdb_sysroot.
2015-04-28Fix py-parameter.exp and scm-parameter.exp path matchingAndy Wingo3-2/+11
gdb/testsuite/ChangeLog: * gdb.python/py-parameter.exp: * gdb.guile/scm-parameter.exp: Escape the path that we are matching against, as it might contain characters that are special to regular expressions.
2015-04-27TUI: avoid calling strcpy() on identical string objectsPatrick Palka2-1/+8
In tui_set_source_content(), when offset == 0 the source and destination pointers of the call to strcpy() are actually the same. In this case not only is strcpy() unnecessary but it is also UB when the two strings overlap. gdb/ChangeLog: * tui/tui-source.c (tui_set_source_content): Avoid calling strcpy() when offset is 0.
2015-04-27Fix PR gdb/18155Patrick Palka2-7/+6
For no good reason the function tui_free_window() is freeing the locator window when we pass it an SRC_WIN or a DISASSEM_WIN. This behavior doesn't make much sense because the locator window is always visible and its contents do not change when the main window changes. This behavior triggers the above PR because when we switch from one TUI window to another (in the PR, from the src window to the asm window) we call tui_free_window() on the previously active window (in the PR, the src window). The function then frees the src window along with the locator window and later we segfault when the now-active asm window tries to query the locator window about the inferior's PC. This patch fixes this apparently wrong behavior by changing tui_free_window() to not free the locator window when we pass it an SRC_WIN or a DISASSEM_WIN. gdb/ChangeLog: PR gdb/18155 * tui/tui-data.c (tui_free_window): Don't free the locator window when passed an SRC_WIN or a DISASSEM_WIN.
2015-04-27Make type-safe the 'content' field of struct tui_gen_win_infoPatrick Palka8-85/+94
The 'content' field of struct tui_gen_win_info currently has type void ** but the field always stores an object of type tui_win_content. Instead of unnecessarily casting to and from void ** we should just give the field the type tui_win_content in the first place. This patch does this and also eliminates all now-redundant casts involving the 'content' struct field that I could find. gdb/ChangeLog: * tui/tui-data.h (struct tui_win_element): Forward-declare. (tui_win_content): Move declaration. (struct tui_gen_win_info): Give 'content' field the type tui_win_content. * tui/tui-data.c (init_content_element): Remove redundant and erroneous casts. (tui_add_content_elements): Remove erroneous cast. * tui/tui-disasm.c (tui_set_disassem_content): Remove redundant casts. (tui_get_begin_asm_address): Likewise. * tui/tui-regs.c (tui_show_registers): Likewise. (tui_show_register_group): Likewise. (tui_display_registers_from): Likewise. (tui_check_register_values): Likewise. * tui/tui-source.c (tui_set_source_content): Likewise. (tui_set_source_content_nil): Likewise. (tui_source_is_displayed): Likewise. * tui/tui-stack.c (tui_show_locator_content): Likewise. (tui_set_locator_fullname): Likewise. (tui_set_locator_info): Likewise. (tui_show_frame_info): Likewise. * tui/tui-winsource.c (tui_clear_source_content): Likewise. (tui_show_source_line): Likewise. (tui_horizontal_source_scroll): Likewise. (tui_update_breakpoint_info): Likewise. (tui_set_exec_info_content): Likewise. (tui_show_exec_info_content): Likewise. (tui_alloc_source_buffer): Likewise. (tui_line_is_displayed): Likewise. (tui_addr_is_displayed): Likewise.
2015-04-27Add support for catching exec events on FreeBSD.John Baldwin2-0/+41
FreeBSD kernels that support fork tracing always stop a process to report events for exec. Such a process will have the PL_FLAG_EXEC flag set in the pl_flags field of the ptrace_lwpinfo struct returned by PT_LWPINFO. The structure does not include the pathname passed to exec, so use fbsd_pid_to_exec_file to query the pathname of the process' executable. gdb/ChangeLog: * fbsd-nat.c: (fbsd_wait) [PL_FLAG_EXEC]: Report TARGET_WAITKIND_EXECD event if PL_FLAG_EXEC is set. [PL_FLAG_EXEC] (fbsd_insert_exec_catchpoint): New function. [PL_FLAG_EXEC] (fbsd_remove_exec_catchpoint): New function. (fbsd_nat_add_target) [PL_FLAG_EXEC]: Set "to_insert_exec_catchpoint" to "fbsd_insert_exec_catchpoint". Set "to_remove_exec_catchpoint" to "fbsd_remove_exec_catchpoint".
2015-04-27Enable fork tracing for native FreeBSD targets.John Baldwin2-0/+298
Enable PT_FOLLOW_FORK on all processes. When this is enabled, both the parent and child process stop when a fork or vfork occurs. A target operation for wait uses PT_LWPINFO to fetch more detailed information about the state of a stopped process. A parent process sets the PL_FLAG_FORKED flag in the pl_flags field of the structure returned by PT_LWPINFO as well as the pid of the new child process. The child process sets the PL_FLAG_CHILD flag in the pl_flags field. When a fork is detected, the wait hook waits for both processes to report their respective events. It then reports the fork to GDB as a single TARGET_WAITKIND_FORKED or TARGET_WAITKIND_VFORKED event. The kernel does not guarantee the order the events are reported in. If the parent process' event is reported first, then the wait hook explicitly waits for the child process. If the child process' event is reported first, the event is recorded on an internal list of pending child events and the wait hook waits for another event. Later when the parent process' event is reported, the parent will use the previously-recorded child process event instead of explicitly waiting on the child process. To distinguish vfork events from fork events, the external process structure for the child process is extracted from the kernel. The P_PPWAIT flag is set in the ki_flags field of this structure if the process was created via vfork, but it is not set for a regular fork. gdb/ChangeLog: * fbsd-nat.c: [PT_LWPINFO] New variable super_wait. [TDP_RFPPWAIT] New variable fbsd_pending_children. [TDP_RFPPWAIT] (fbsd_remember_child): New function. [TDP_RFPPWAIT] (fbsd_is_child_pending): New function. [TDP_RFPPWAIT] (fbsd_fetch_kinfo_proc): New function. [PT_LWPINFO] (fbsd_wait): New function. [TDP_RFPPWAIT] (fbsd_follow_fork): New function. [TDP_RFPPWAIT] (fbsd_insert_fork_catchpoint): New function. [TDP_RFPPWAIT] (fbsd_remove_fork_catchpoint): New function. [TDP_RFPPWAIT] (fbsd_insert_vfork_catchpoint): New function. [TDP_RFPPWAIT] (fbsd_remove_vfork_catchpoint): New function. [TDP_RFPPWAIT] (fbsd_enable_follow_fork): New function. [TDP_RFPPWAIT] (fbsd_post_startup_inferior): New function. [TDP_RFPPWAIT] (fbsd_post_attach): New function. (fbsd_nat_add_target) [PT_LWPINFO] Set "to_wait" to "fbsd_wait". [TDP_RFPPWAIT] Set "to_follow_fork" to "fbsd_follow_fork". Set "to_insert_fork_catchpoint" to "fbsd_insert_fork_catchpoint". Set "to_remove_fork_catchpoint" to "fbsd_remove_fork_catchpoint". Set "to_insert_vfork_catchpoint" to "fbsd_insert_vfork_catchpoint". Set "to_remove_vfork_catchpoint" to "fbsd_remove_vfork_catchpoint". Set "to_post_startup_inferior" to "fbsd_post_startup_inferior". Set "to_post_attach" to "fbsd_post_attach".
2015-04-27Add fbsd_nat_add_target.John Baldwin7-26/+30
Add a wrapper for add_target in fbsd-nat.c to override target operations common to all native FreeBSD targets. gdb/ChangeLog: * fbsd-nat.c (fbsd_pid_to_exec_file): Mark static. (fbsd_find_memory_regions): Mark static. (fbsd_nat_add_target): New function. * fbsd-nat.h: Export fbsd_nat_add_target and remove prototypes for fbsd_pid_to_exec_file and fbsd_find_memory_regions. * amd64fbsd-nat.c (_initialize_amd64fbsd_nat): Use fbsd_nat_add_target. * i386fbsd-nat.c (_initialize_i386fbsd_nat): Likewise. * ppcfbsd-nat.c (_initialize_ppcfbsd_nat): Likewise. * sparc64fbsd-nat.c (_initialize_sparc64fbsd_nat): Likewise.
2015-04-27Do not manipulate "target:" filenames as local pathsGary Benson3-3/+14
This commit alters two places that manipulate object file filenames to detect "target:" filenames and to not attempt to manipulate them as paths on the local filesystem: - allocate_objfile is updated to not attempt to expand "target:" filenames with gdb_abspath. - load_auto_scripts_for_objfile is updated to not attempt to load auto-load scripts for object files with "target:" filenames. gdb/ChangeLog: * objfiles.c (allocate_objfile): Do not attempt to expand name if name is a "target:" filename. * auto-load.c (load_auto_scripts_for_objfile): Do not attempt to load auto-load scripts for objfiles with "target:" filenames.
2015-04-27S390: Vector ABI supportAndreas Arnez3-13/+132
With the S390 vector ABI, vector registers are used for passing vector arguments and for returning a vector. Support this ABI in inferior function calls and when setting or retrieving a function's return value. gdb/ChangeLog: * s390-linux-tdep.c: Include "elf/s390.h" and "elf-bfd.h". (enum s390_vector_abi_kind): New enum. (struct gdbarch_tdep)<vector_abi>: New field. (s390_effective_inner_type): Add parameter min_size. Stop unwrapping if the inner type is smaller than min_size. (s390_function_arg_float): Adjust call to s390_effective_inner_type. (s390_function_arg_vector): New function. (s390_function_arg_integer): Adjust comment. (struct s390_arg_state)<vr>: New field. (s390_handle_arg): Add parameter 'is_unnamed'. Pass vector arguments according to vector ABI when appropriate. (s390_push_dummy_call): Initialize the argument state's field 'vr'. Adjust calls to s390_handle_arg. (s390_register_return_value): Handle vector return values. (s390_return_value): Apply the "register" return value convention to a vector when appropriate. (s390_gdbarch_init): Initialize tdep->vector_abi. * NEWS: Announce S390 vector ABI support.
2015-04-27S390: Re-arrange implementation of s390_return_valueAndreas Arnez2-85/+81
Move related logic in the implementation of s390_return_value closer together. This makes it easier to read and extend. gdb/ChangeLog: * s390-linux-tdep.c (s390_return_value_convention): Remove function. Inline its logic... (s390_return_value): ...here. Instead, move the handling of the "register" return value convention... (s390_register_return_value): ...here. New function.
2015-04-27S390: Restructure s390_push_dummy_callAndreas Arnez2-290/+220
Simplify the structure of s390_push_dummy_call and its various helper functions. This reduces the code and makes it easier to extend. The new code should be functionally equivalent to the old one, except that copies created by the caller are now always aligned on an 8-byte boundary. gdb/ChangeLog: * s390-linux-tdep.c (is_float_singleton): Remove function. Move the "singleton" part of the logic... (s390_effective_inner_type): ...here. New function. (is_float_like): Remove function. Inline its logic... (s390_function_arg_float): ...here. (is_pointer_like, is_integer_like, is_struct_like): Remove functions. Inline their logic... (s390_function_arg_integer): ...here. (s390_function_arg_pass_by_reference): Remove function. (extend_simple_arg): Remove function. (alignment_of): Remove function. (struct s390_arg_state): New structure. (s390_handle_arg): New function. (s390_push_dummy_call): Move parameter placement logic to the new function s390_handle_arg. Call it for calculating the stack area sizes first, and again for actually writing the parameters.
2015-04-27S390: For zero, let is_power_of_two() return falseAndreas Arnez2-1/+7
This fixes a minor issue with the helper function is_power_of_two(), which returned non-zero ("true") if the argument was zero. This led to a wrong decision when passing a zero-sized struct in an inferior function call. gdb/ChangeLog: * s390-linux-tdep.c (is_power_of_two): Add comment. Return false if the argument is zero.