Accepting request 40473 from devel:gcc
Copy from devel:gcc/gdb based on submit request 40473 from user rguenther OBS-URL: https://build.opensuse.org/request/show/40473 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/gdb?expand=0&rev=74
This commit is contained in:
parent
06639f1b59
commit
8ed182f504
105
gdb-archer-vla-ref-optimizedout.patch
Normal file
105
gdb-archer-vla-ref-optimizedout.patch
Normal file
@ -0,0 +1,105 @@
|
||||
commit a683bac73af74a757591672d89d720169c0b5ec9
|
||||
Author: Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
Date: Thu May 13 18:08:30 2010 +0200
|
||||
|
||||
Support DW_AT_upper_bound is referencing an optimized-out variable.
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=591879
|
||||
|
||||
--- a/gdb/dwarf2loc.c
|
||||
+++ b/gdb/dwarf2loc.c
|
||||
@@ -383,6 +383,9 @@ dwarf_loclist_baton_eval (struct dwarf2_loclist_baton *dllbaton,
|
||||
size_t size;
|
||||
struct value *val;
|
||||
|
||||
+ if (!dllbaton)
|
||||
+ return 0;
|
||||
+
|
||||
data = find_location_expression (dllbaton, &size,
|
||||
get_frame_address_in_block (frame));
|
||||
if (data == NULL)
|
||||
--- a/gdb/dwarf2read.c
|
||||
+++ b/gdb/dwarf2read.c
|
||||
@@ -11693,6 +11693,11 @@ dwarf2_attr_to_loclist_baton (struct attribute *attr, struct dwarf2_cu *cu)
|
||||
{
|
||||
struct dwarf2_loclist_baton *baton;
|
||||
|
||||
+ /* DW_AT_location of the referenced DIE may be missing if the referenced
|
||||
+ variable has been optimized out. */
|
||||
+ if (!attr)
|
||||
+ return NULL;
|
||||
+
|
||||
if (!(attr_form_is_section_offset (attr)
|
||||
/* ".debug_loc" may not exist at all, or the offset may be outside
|
||||
the section. If so, fall through to the complaint in the
|
||||
--- a/gdb/testsuite/gdb.dwarf2/dw2-bound-loclist.S
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/dw2-bound-loclist.S
|
||||
@@ -51,6 +51,17 @@ vardata:
|
||||
.4byte .Llen_var-.Lcu1_begin /* DW_AT_upper_bound */
|
||||
.byte 0 /* End of children of die */
|
||||
|
||||
+ /* DW_AT_upper_bound is referencing an optimized-out variable. */
|
||||
+.Larrayb_type:
|
||||
+ .uleb128 2 /* Abbrev: DW_TAG_array_type */
|
||||
+ .4byte .Lchar_type-.Lcu1_begin /* DW_AT_type */
|
||||
+
|
||||
+ .uleb128 3 /* Abbrev: DW_TAG_subrange_type */
|
||||
+ .4byte .Luint_type-.Lcu1_begin /* DW_AT_type */
|
||||
+ .byte 0 /* DW_AT_lower_bound */
|
||||
+ .4byte .Llenb_var-.Lcu1_begin /* DW_AT_upper_bound */
|
||||
+ .byte 0 /* End of children of die */
|
||||
+
|
||||
.Luint_type:
|
||||
.uleb128 4 /* Abbrev: DW_TAG_base_type */
|
||||
.4byte .Luint_str /* DW_AT_name */
|
||||
@@ -69,9 +80,24 @@ vardata:
|
||||
.4byte .Luint_type-.Lcu1_begin /* DW_AT_type */
|
||||
.4byte .Llen_loclist-.Lloclist /* DW_AT_location */
|
||||
|
||||
+ /* optimized-out variable for b_string. */
|
||||
+.Llenb_var:
|
||||
+ .uleb128 7 /* Abbrev: DW_TAG_variable artificial no DW_AT_location */
|
||||
+ .byte 1 /* DW_AT_artificial */
|
||||
+ .4byte .Luint_type-.Lcu1_begin /* DW_AT_type */
|
||||
+
|
||||
.uleb128 6 /* Abbrev: DW_TAG_variable DW_FORM_string */
|
||||
.string "a_string" /* DW_AT_name */
|
||||
- .4byte .Larray_type-.Lcu1_begin/* DW_AT_type */
|
||||
+ .4byte .Larray_type-.Lcu1_begin /* DW_AT_type */
|
||||
+ .byte 2f - 1f /* DW_AT_location */
|
||||
+1: .byte 3 /* DW_OP_addr */
|
||||
+ .4byte vardata /* <addr> */
|
||||
+2:
|
||||
+
|
||||
+ /* DW_AT_upper_bound is referencing an optimized-out variable. */
|
||||
+ .uleb128 6 /* Abbrev: DW_TAG_variable DW_FORM_string */
|
||||
+ .string "b_string" /* DW_AT_name */
|
||||
+ .4byte .Larrayb_type-.Lcu1_begin /* DW_AT_type */
|
||||
.byte 2f - 1f /* DW_AT_location */
|
||||
1: .byte 3 /* DW_OP_addr */
|
||||
.4byte vardata /* <addr> */
|
||||
@@ -164,6 +190,16 @@ vardata:
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
+ .uleb128 7 /* Abbrev code */
|
||||
+ .uleb128 0x34 /* DW_TAG_variable */
|
||||
+ .byte 0x0 /* no_children */
|
||||
+ .uleb128 0x34 /* DW_AT_artificial */
|
||||
+ .uleb128 0x0c /* DW_FORM_flag */
|
||||
+ .uleb128 0x49 /* DW_AT_type */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .byte 0x0 /* Terminator */
|
||||
+ .byte 0x0 /* Terminator */
|
||||
+
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
/* String table */
|
||||
--- a/gdb/testsuite/gdb.dwarf2/dw2-bound-loclist.exp
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/dw2-bound-loclist.exp
|
||||
@@ -46,3 +46,6 @@ if ![runto "*main"] {
|
||||
|
||||
gdb_test "p a_string" { = "seen"}
|
||||
gdb_test "ptype a_string" {type = char \[4\]}
|
||||
+
|
||||
+gdb_test "p b_string" { = (0x[0-9a-f]+ )?"seennotseen"}
|
||||
+gdb_test "ptype b_string" {type = char \[\]}
|
21
gdb-archer-vla-test-oom.patch
Normal file
21
gdb-archer-vla-test-oom.patch
Normal file
@ -0,0 +1,21 @@
|
||||
commit ec5a7769d5c05542d12fc21afa25f32360db7de4
|
||||
Author: Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
Date: Wed May 12 22:00:46 2010 +0200
|
||||
|
||||
Fix mb_reserve:
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=590635
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.base/vla-overflow.exp b/gdb/testsuite/gdb.base/vla-overflow.exp
|
||||
index 7203a48..24a608f 100644
|
||||
--- a/gdb/testsuite/gdb.base/vla-overflow.exp
|
||||
+++ b/gdb/testsuite/gdb.base/vla-overflow.exp
|
||||
@@ -66,7 +66,8 @@ proc memory_v_pages_get {} {
|
||||
|
||||
set pages_found [memory_v_pages_get]
|
||||
|
||||
-set mb_reserve 10
|
||||
+# s390x with glibc-debuginfo.s390x installed used approx. 16MB.
|
||||
+set mb_reserve 40
|
||||
verbose -log "pages_found = $pages_found, mb_reserve = $mb_reserve"
|
||||
set kb_found [expr $pages_found * $pagesize / 1024]
|
||||
set kb_permit [expr $kb_found + 1 * 1024 + $mb_reserve * 1024]
|
974
gdb-archer.patch
974
gdb-archer.patch
File diff suppressed because it is too large
Load Diff
14
gdb-bz539590-gnu-ifunc-fix-cond.patch
Normal file
14
gdb-bz539590-gnu-ifunc-fix-cond.patch
Normal file
@ -0,0 +1,14 @@
|
||||
--- ./gdb/breakpoint.c 2010-04-26 02:35:53.000000000 +0200
|
||||
+++ ./gdb/breakpoint.c 2010-04-26 02:33:26.000000000 +0200
|
||||
@@ -8499,6 +8499,11 @@ update_breakpoint_locations (struct brea
|
||||
{
|
||||
struct gdb_exception e;
|
||||
|
||||
+ /* Temporary workaround before the non-intrusive ifunc patch gets in.
|
||||
+ exp parsing can now call inferior function invalidating
|
||||
+ EXISTING_LOCATIONS. */
|
||||
+ existing_locations = NULL;
|
||||
+
|
||||
s = b->cond_string;
|
||||
TRY_CATCH (e, RETURN_MASK_ERROR)
|
||||
{
|
40
gdb-bz570635-prettyprint-doc1.patch
Normal file
40
gdb-bz570635-prettyprint-doc1.patch
Normal file
@ -0,0 +1,40 @@
|
||||
RFA: update `print' docs
|
||||
http://sourceware.org/ml/gdb-patches/2010-03/msg00236.html
|
||||
http://sourceware.org/ml/gdb-cvs/2010-03/msg00048.html
|
||||
|
||||
### src/gdb/doc/ChangeLog 2010/03/01 17:19:22 1.1017
|
||||
### src/gdb/doc/ChangeLog 2010/03/05 20:01:21 1.1018
|
||||
## -1,3 +1,8 @@
|
||||
+2010-03-05 Tom Tromey <tromey@redhat.com>
|
||||
+
|
||||
+ * gdb.texinfo (Data): Link to pretty-printing.
|
||||
+ (Output Formats): Likewise. Correct text.
|
||||
+
|
||||
2010-03-01 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* gdb.texinfo (Types): Describe <struct> and <flags>.
|
||||
--- src/gdb/doc/gdb.texinfo 2010/03/01 17:19:22 1.676
|
||||
+++ src/gdb/doc/gdb.texinfo 2010/03/05 20:01:21 1.677
|
||||
@@ -6661,7 +6661,8 @@
|
||||
command (abbreviated @code{p}), or its synonym @code{inspect}. It
|
||||
evaluates and prints the value of an expression of the language your
|
||||
program is written in (@pxref{Languages, ,Using @value{GDBN} with
|
||||
-Different Languages}).
|
||||
+Different Languages}). It may also print the expression using a
|
||||
+Python-based pretty-printer (@pxref{Pretty Printing}).
|
||||
|
||||
@table @code
|
||||
@item print @var{expr}
|
||||
@@ -7159,8 +7160,10 @@
|
||||
@item r
|
||||
@cindex raw printing
|
||||
Print using the @samp{raw} formatting. By default, @value{GDBN} will
|
||||
-use a type-specific pretty-printer. The @samp{r} format bypasses any
|
||||
-pretty-printer which might exist for the value's type.
|
||||
+use a Python-based pretty-printer, if one is available (@pxref{Pretty
|
||||
+Printing}). This typically results in a higher-level display of the
|
||||
+value's contents. The @samp{r} format bypasses any Python
|
||||
+pretty-printer which might exist.
|
||||
@end table
|
||||
|
||||
For example, to print the program counter in hex (@pxref{Registers}), type
|
182
gdb-bz570635-prettyprint-doc2.patch
Normal file
182
gdb-bz570635-prettyprint-doc2.patch
Normal file
@ -0,0 +1,182 @@
|
||||
Re: [patch] doc-python: Pretty Printing split user / developer
|
||||
http://sourceware.org/ml/gdb-patches/2010-04/msg00757.html
|
||||
http://sourceware.org/ml/gdb-cvs/2010-04/msg00221.html
|
||||
|
||||
[ Backported for Fedora. ]
|
||||
|
||||
### src/gdb/doc/ChangeLog 2010/04/22 04:09:25 1.1053
|
||||
### src/gdb/doc/ChangeLog 2010/04/22 16:32:43 1.1054
|
||||
## -1,3 +1,14 @@
|
||||
+2010-04-22 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
+
|
||||
+ * gdb.texinfo (Data): New @menu reference to Pretty Printing.
|
||||
+ (Python API): Change the reference to Pretty Printing API.
|
||||
+ (Pretty Printing): Move the user part under the Data node. Reformat
|
||||
+ the sample output to 72 columns. Create a new reference to Pretty
|
||||
+ Printing API. Rename the API part ...
|
||||
+ (Pretty Printing API): To a new node name.
|
||||
+ (Selecting Pretty-Printers, Progspaces In Python, Objfiles In Python)
|
||||
+ (GDB/MI Variable Objects): Change references to Pretty Printing API.
|
||||
+
|
||||
2010-04-21 Stan Shebs <stan@codesourcery.com>
|
||||
|
||||
* gdb.texinfo (Tracepoint Actions): Mention synonymy of actions
|
||||
--- gdb-7.1/gdb/doc/gdb.texinfo.orig 2010-04-22 19:08:30.000000000 +0200
|
||||
+++ gdb-7.1/gdb/doc/gdb.texinfo 2010-04-22 19:10:41.000000000 +0200
|
||||
@@ -6727,6 +6727,7 @@ Table}.
|
||||
* Memory:: Examining memory
|
||||
* Auto Display:: Automatic display
|
||||
* Print Settings:: Print settings
|
||||
+* Pretty Printing:: Python pretty printing
|
||||
* Value History:: Value history
|
||||
* Convenience Vars:: Convenience variables
|
||||
* Registers:: Registers
|
||||
@@ -7897,6 +7898,42 @@ Do not pretty print C@t{++} virtual func
|
||||
Show whether C@t{++} virtual function tables are pretty printed, or not.
|
||||
@end table
|
||||
|
||||
+@node Pretty Printing
|
||||
+@section Pretty Printing
|
||||
+
|
||||
+@value{GDBN} provides a mechanism to allow pretty-printing of values using
|
||||
+Python code. It greatly simplifies the display of complex objects. This
|
||||
+mechanism works for both MI and the CLI.
|
||||
+
|
||||
+For example, here is how a C@t{++} @code{std::string} looks without a
|
||||
+pretty-printer:
|
||||
+
|
||||
+@smallexample
|
||||
+(@value{GDBP}) print s
|
||||
+$1 = @{
|
||||
+ static npos = 4294967295,
|
||||
+ _M_dataplus = @{
|
||||
+ <std::allocator<char>> = @{
|
||||
+ <__gnu_cxx::new_allocator<char>> = @{
|
||||
+ <No data fields>@}, <No data fields>
|
||||
+ @},
|
||||
+ members of std::basic_string<char, std::char_traits<char>,
|
||||
+ std::allocator<char> >::_Alloc_hider:
|
||||
+ _M_p = 0x804a014 "abcd"
|
||||
+ @}
|
||||
+@}
|
||||
+@end smallexample
|
||||
+
|
||||
+With a pretty-printer for @code{std::string} only the contents are printed:
|
||||
+
|
||||
+@smallexample
|
||||
+(@value{GDBP}) print s
|
||||
+$2 = "abcd"
|
||||
+@end smallexample
|
||||
+
|
||||
+For implementing pretty printers for new types you should read the Python API
|
||||
+details (@pxref{Pretty Printing API}).
|
||||
+
|
||||
@node Value History
|
||||
@section Value History
|
||||
|
||||
@@ -19608,8 +19645,8 @@ situation, a Python @code{KeyboardInterr
|
||||
* Exception Handling::
|
||||
* Auto-loading:: Automatically loading Python code.
|
||||
* Values From Inferior:: Python representation of values.
|
||||
-* Types In Python:: Python representation of types.
|
||||
-* Pretty Printing:: Pretty-printing values.
|
||||
+* Types In Python:: Python representation of types.
|
||||
+* Pretty Printing API:: Pretty-printing values.
|
||||
* Selecting Pretty-Printers:: How GDB chooses a pretty-printer.
|
||||
* Inferiors In Python:: Python representation of inferiors (processes)
|
||||
* Threads In Python:: Accessing inferior threads from Python.
|
||||
@@ -20241,37 +20278,10 @@ A function internal to @value{GDBN}. Th
|
||||
convenience functions.
|
||||
@end table
|
||||
|
||||
-@node Pretty Printing
|
||||
-@subsubsection Pretty Printing
|
||||
-
|
||||
-@value{GDBN} provides a mechanism to allow pretty-printing of values
|
||||
-using Python code. The pretty-printer API allows application-specific
|
||||
-code to greatly simplify the display of complex objects. This
|
||||
-mechanism works for both MI and the CLI.
|
||||
-
|
||||
-For example, here is how a C@t{++} @code{std::string} looks without a
|
||||
-pretty-printer:
|
||||
+@node Pretty Printing API
|
||||
+@subsubsection Pretty Printing API
|
||||
|
||||
-@smallexample
|
||||
-(@value{GDBP}) print s
|
||||
-$1 = @{
|
||||
- static npos = 4294967295,
|
||||
- _M_dataplus = @{
|
||||
- <std::allocator<char>> = @{
|
||||
- <__gnu_cxx::new_allocator<char>> = @{<No data fields>@}, <No data fields>@},
|
||||
- members of std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider:
|
||||
- _M_p = 0x804a014 "abcd"
|
||||
- @}
|
||||
-@}
|
||||
-@end smallexample
|
||||
-
|
||||
-After a pretty-printer for @code{std::string} has been installed, only
|
||||
-the contents are printed:
|
||||
-
|
||||
-@smallexample
|
||||
-(@value{GDBP}) print s
|
||||
-$2 = "abcd"
|
||||
-@end smallexample
|
||||
+An example output is provided (@pxref{Pretty Printing}).
|
||||
|
||||
A pretty-printer is just an object that holds a value and implements a
|
||||
specific interface, defined here.
|
||||
@@ -20359,7 +20369,7 @@ attribute.
|
||||
|
||||
A function on one of these lists is passed a single @code{gdb.Value}
|
||||
argument and should return a pretty-printer object conforming to the
|
||||
-interface definition above (@pxref{Pretty Printing}). If a function
|
||||
+interface definition above (@pxref{Pretty Printing API}). If a function
|
||||
cannot create a pretty-printer for the value, it should return
|
||||
@code{None}.
|
||||
|
||||
@@ -20436,7 +20446,7 @@ printers with a specific objfile, @value
|
||||
printers for the specific version of the library used by each
|
||||
inferior.
|
||||
|
||||
-To continue the @code{std::string} example (@pxref{Pretty Printing}),
|
||||
+To continue the @code{std::string} example (@pxref{Pretty Printing API}),
|
||||
this code might appear in @code{gdb.libstdcxx.v6}:
|
||||
|
||||
@smallexample
|
||||
@@ -21048,7 +21058,7 @@ The @code{pretty_printers} attribute is
|
||||
used to look up pretty-printers. A @code{Value} is passed to each
|
||||
function in order; if the function returns @code{None}, then the
|
||||
search continues. Otherwise, the return value should be an object
|
||||
-which is used to format the value. @xref{Pretty Printing}, for more
|
||||
+which is used to format the value. @xref{Pretty Printing API}, for more
|
||||
information.
|
||||
@end defivar
|
||||
|
||||
@@ -24875,7 +24885,7 @@ then this attribute will not be present.
|
||||
@item displayhint
|
||||
A dynamic varobj can supply a display hint to the front end. The
|
||||
value comes directly from the Python pretty-printer object's
|
||||
-@code{display_hint} method. @xref{Pretty Printing}.
|
||||
+@code{display_hint} method. @xref{Pretty Printing API}.
|
||||
@end table
|
||||
|
||||
Typical output will look like this:
|
||||
@@ -25047,7 +25057,7 @@ The result may have its own attributes:
|
||||
@item displayhint
|
||||
A dynamic varobj can supply a display hint to the front end. The
|
||||
value comes directly from the Python pretty-printer object's
|
||||
-@code{display_hint} method. @xref{Pretty Printing}.
|
||||
+@code{display_hint} method. @xref{Pretty Printing API}.
|
||||
|
||||
@item has_more
|
||||
This is an integer attribute which is nonzero if there are children
|
||||
@@ -25411,7 +25421,7 @@ single argument. @value{GDBN} will call
|
||||
the varobj @var{name} as an argument (this is done so that the same
|
||||
Python pretty-printing code can be used for both the CLI and MI).
|
||||
When called, this object must return an object which conforms to the
|
||||
-pretty-printing interface (@pxref{Pretty Printing}).
|
||||
+pretty-printing interface (@pxref{Pretty Printing API}).
|
||||
|
||||
The pre-defined function @code{gdb.default_visualizer} may be used to
|
||||
select a visualizer by following the built-in process
|
624
gdb-bz575292-delayed-physname.patch
Normal file
624
gdb-bz575292-delayed-physname.patch
Normal file
@ -0,0 +1,624 @@
|
||||
Made more safe (but less effective) by using a linked list.
|
||||
|
||||
Based on:
|
||||
Re: [RFA] Delayed physname computation
|
||||
http://sourceware.org/ml/gdb-patches/2010-05/msg00248.html
|
||||
|
||||
Neither its obstack-leak.patch nor
|
||||
[patch] Fix duplicate types for single DIE
|
||||
http://sourceware.org/ml/gdb-patches/2010-05/msg00271.html
|
||||
is needed as the linked list is used instead.
|
||||
|
||||
--- ./gdb/dwarf2read.c 2010-05-13 18:26:22.000000000 +0200
|
||||
+++ ./gdb/dwarf2read.c 2010-05-13 18:45:04.000000000 +0200
|
||||
@@ -251,6 +251,28 @@ struct comp_unit_head
|
||||
unsigned int first_die_offset;
|
||||
};
|
||||
|
||||
+/* Type used for delaying computation of method physnames.
|
||||
+ See comments for compute_delayed_physnames. */
|
||||
+struct delayed_method_info
|
||||
+{
|
||||
+ struct delayed_method_info *next;
|
||||
+
|
||||
+ /* The type to which the method is attached, i.e., its parent class. */
|
||||
+ struct type *type;
|
||||
+
|
||||
+ /* The index of the method in the type's function fieldlists. */
|
||||
+ int fnfield_index;
|
||||
+
|
||||
+ /* The index of the method in the fieldlist. */
|
||||
+ int index;
|
||||
+
|
||||
+ /* The name of the DIE. */
|
||||
+ const char *name;
|
||||
+
|
||||
+ /* The DIE associated with this method. */
|
||||
+ struct die_info *die;
|
||||
+};
|
||||
+
|
||||
/* Internal state when decoding a particular compilation unit. */
|
||||
struct dwarf2_cu
|
||||
{
|
||||
@@ -329,6 +351,10 @@ struct dwarf2_cu
|
||||
/* Header data from the line table, during full symbol processing. */
|
||||
struct line_header *line_header;
|
||||
|
||||
+ /* A list of methods which need to have physnames computed
|
||||
+ after all type information has been read. */
|
||||
+ struct delayed_method_info *method_list;
|
||||
+
|
||||
/* Mark used when releasing cached dies. */
|
||||
unsigned int mark : 1;
|
||||
|
||||
@@ -1208,6 +1234,9 @@ static void destroy_section (struct dwar
|
||||
static struct dwarf2_locexpr_baton *dwarf2_attr_to_locexpr_baton
|
||||
(struct attribute *attr, struct dwarf2_cu *cu);
|
||||
|
||||
+static const char *dwarf2_physname (char *name, struct die_info *die,
|
||||
+ struct dwarf2_cu *cu);
|
||||
+
|
||||
/* Try to locate the sections we need for DWARF 2 debugging
|
||||
information and return true if we have enough to do something. */
|
||||
|
||||
@@ -3435,6 +3464,58 @@ load_full_comp_unit (struct dwarf2_per_c
|
||||
discard_cleanups (free_cu_cleanup);
|
||||
}
|
||||
|
||||
+/* Add a DIE to the delayed physname list. */
|
||||
+static void
|
||||
+add_to_method_list (struct type *type, int fnfield_index, int index,
|
||||
+ const char *name, struct die_info *die,
|
||||
+ struct dwarf2_cu *cu)
|
||||
+{
|
||||
+ struct delayed_method_info *mi;
|
||||
+
|
||||
+ mi = xmalloc (sizeof (*mi));
|
||||
+ mi->next = cu->method_list;
|
||||
+ cu->method_list = mi;
|
||||
+ mi->type = type;
|
||||
+ mi->fnfield_index = fnfield_index;
|
||||
+ mi->index = index;
|
||||
+ mi->name = name;
|
||||
+ mi->die = die;
|
||||
+}
|
||||
+
|
||||
+/* Compute the physnames of any methods on the CU's method list.
|
||||
+
|
||||
+ The computation of method physnames is delayed in order to avoid the
|
||||
+ (bad) condition that one of the method's formal parameters is of an as yet
|
||||
+ incomplete type. */
|
||||
+static void
|
||||
+compute_delayed_physnames (struct dwarf2_cu *cu)
|
||||
+{
|
||||
+ struct delayed_method_info *mi;
|
||||
+
|
||||
+ for (mi = cu->method_list; mi; mi = mi->next)
|
||||
+ {
|
||||
+ char *physname;
|
||||
+ struct fn_fieldlist *fn_flp
|
||||
+ = &TYPE_FN_FIELDLIST (mi->type, mi->fnfield_index);
|
||||
+ physname = (char *) dwarf2_physname ((char *) mi->name, mi->die, cu);
|
||||
+ fn_flp->fn_fields[mi->index].physname = physname ? physname : "";
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+method_list_cleanup (void *arg)
|
||||
+{
|
||||
+ struct delayed_method_info **method_list_pointer = arg;
|
||||
+
|
||||
+ while (*method_list_pointer)
|
||||
+ {
|
||||
+ struct delayed_method_info *mi = *method_list_pointer;
|
||||
+
|
||||
+ *method_list_pointer = mi->next;
|
||||
+ xfree (mi);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* Generate full symbol information for PST and CU, whose DIEs have
|
||||
already been loaded into memory. */
|
||||
|
||||
@@ -3447,7 +3528,7 @@ process_full_comp_unit (struct dwarf2_pe
|
||||
bfd *abfd = objfile->obfd;
|
||||
CORE_ADDR lowpc, highpc;
|
||||
struct symtab *symtab;
|
||||
- struct cleanup *back_to;
|
||||
+ struct cleanup *back_to, *delayed_list_cleanup;
|
||||
CORE_ADDR baseaddr;
|
||||
|
||||
baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
|
||||
@@ -3457,11 +3538,22 @@ process_full_comp_unit (struct dwarf2_pe
|
||||
|
||||
cu->list_in_scope = &file_symbols;
|
||||
|
||||
+ /* If methods were found in the partial symbol table, we allocate one
|
||||
+ big buffer to hold the entire delayed list for the CU. */
|
||||
+ delayed_list_cleanup = make_cleanup (method_list_cleanup,
|
||||
+ &cu->method_list);
|
||||
+
|
||||
dwarf2_find_base_address (cu->dies, cu);
|
||||
|
||||
/* Do line number decoding in read_file_scope () */
|
||||
process_die (cu->dies, cu);
|
||||
|
||||
+ /* Now that we have processed all the DIEs in the CU, all the types
|
||||
+ should be complete, and it should now be safe to compute all of the
|
||||
+ physnames. */
|
||||
+ compute_delayed_physnames (cu);
|
||||
+ do_cleanups (delayed_list_cleanup);
|
||||
+
|
||||
/* Some compilers don't define a DW_AT_high_pc attribute for the
|
||||
compilation unit. If the DW_AT_high_pc is missing, synthesize
|
||||
it, by scanning the DIE's below the compilation unit. */
|
||||
@@ -5093,7 +5185,6 @@ dwarf2_add_member_fn (struct field_info
|
||||
int i;
|
||||
struct fn_field *fnp;
|
||||
char *fieldname;
|
||||
- char *physname;
|
||||
struct nextfnfield *new_fnfield;
|
||||
struct type *this_type;
|
||||
|
||||
@@ -5105,9 +5196,6 @@ dwarf2_add_member_fn (struct field_info
|
||||
if (fieldname == NULL)
|
||||
return;
|
||||
|
||||
- /* Get the mangled name. */
|
||||
- physname = (char *) dwarf2_physname (fieldname, die, cu);
|
||||
-
|
||||
/* Look up member function name in fieldlist. */
|
||||
for (i = 0; i < fip->nfnfields; i++)
|
||||
{
|
||||
@@ -5133,7 +5221,7 @@ dwarf2_add_member_fn (struct field_info
|
||||
flp->name = fieldname;
|
||||
flp->length = 0;
|
||||
flp->head = NULL;
|
||||
- fip->nfnfields++;
|
||||
+ i = fip->nfnfields++;
|
||||
}
|
||||
|
||||
/* Create a new member function field and chain it to the field list
|
||||
@@ -5147,9 +5235,19 @@ dwarf2_add_member_fn (struct field_info
|
||||
|
||||
/* Fill in the member function field info. */
|
||||
fnp = &new_fnfield->fnfield;
|
||||
- /* The name is already allocated along with this objfile, so we don't
|
||||
- need to duplicate it for the type. */
|
||||
- fnp->physname = physname ? physname : "";
|
||||
+
|
||||
+ /* Delay processing of the physname until later. */
|
||||
+ if (cu->language == language_cplus || cu->language == language_java)
|
||||
+ {
|
||||
+ add_to_method_list (type, i, flp->length - 1, fieldname,
|
||||
+ die, cu);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ char *physname = (char *) dwarf2_physname (fieldname, die, cu);
|
||||
+ fnp->physname = physname ? physname : "";
|
||||
+ }
|
||||
+
|
||||
fnp->type = alloc_type (objfile);
|
||||
this_type = read_type_die (die, cu);
|
||||
if (this_type && TYPE_CODE (this_type) == TYPE_CODE_FUNC)
|
||||
@@ -5175,7 +5273,7 @@ dwarf2_add_member_fn (struct field_info
|
||||
}
|
||||
else
|
||||
complaint (&symfile_complaints, _("member function type missing for '%s'"),
|
||||
- physname);
|
||||
+ dwarf2_full_name (fieldname, die, cu));
|
||||
|
||||
/* Get fcontext from DW_AT_containing_type if present. */
|
||||
if (dwarf2_attr (die, DW_AT_containing_type, cu) != NULL)
|
||||
@@ -7500,7 +7598,9 @@ load_partial_dies (bfd *abfd, gdb_byte *
|
||||
|| last_die->tag == DW_TAG_interface_type
|
||||
|| last_die->tag == DW_TAG_structure_type
|
||||
|| last_die->tag == DW_TAG_union_type))
|
||||
- || (cu->language == language_ada
|
||||
+ || ((cu->language == language_ada
|
||||
+ || cu->language == language_cplus
|
||||
+ || cu->language == language_java)
|
||||
&& (last_die->tag == DW_TAG_subprogram
|
||||
|| last_die->tag == DW_TAG_lexical_block))))
|
||||
{
|
||||
--- ./gdb/testsuite/gdb.dwarf2/pr11465.S 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.dwarf2/pr11465.S 2010-05-13 18:39:00.000000000 +0200
|
||||
@@ -0,0 +1,355 @@
|
||||
+/* Copyright 2010 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/>. */
|
||||
+
|
||||
+/* Compiled from:
|
||||
+
|
||||
+ namespace N
|
||||
+ {
|
||||
+ class C
|
||||
+ {
|
||||
+ public:
|
||||
+ typedef void (*t) (C);
|
||||
+ C (t) {}
|
||||
+ };
|
||||
+ typedef C::t u;
|
||||
+ u f;
|
||||
+ C c (f);
|
||||
+ };
|
||||
+
|
||||
+ int
|
||||
+ main ()
|
||||
+ {
|
||||
+ return 0;
|
||||
+ }
|
||||
+*/
|
||||
+
|
||||
+ .text
|
||||
+_ZN1N1cE:
|
||||
+ .section .debug_info
|
||||
+d:
|
||||
+ .long .Ldebug_info_end - 1f /* Length of CU info */
|
||||
+1:
|
||||
+ .2byte 0x2 /* DWARF version number */
|
||||
+ .long .Ldebug_abbrev0 /* Abbrev offset */
|
||||
+ .byte 0x4 /* Pointer size */
|
||||
+dieb: .uleb128 0x1 /* DW_TAG_compile_unit */
|
||||
+ .long .LASF4 /* DW_AT_producer */
|
||||
+ .byte 0x4 /* DW_AT_language */
|
||||
+ .long .LASF5 /* DW_AT_name */
|
||||
+ .long .LASF6 /* DW_AT_comp_dir */
|
||||
+ .long 0x0 /* DW_AT_low_pc */
|
||||
+ .long 0x0 /* DW_AT_high_pc */
|
||||
+ .long 0x0 /* DW_AT_entry_pc */
|
||||
+die29: .uleb128 0x2 /* DW_TAG_namespace */
|
||||
+ .string "N" /* DW_AT_name */
|
||||
+die32: .uleb128 0x3 /* DW_TAG_class_type */
|
||||
+ .string "C" /* DW_AT_name */
|
||||
+ .byte 0x1 /* DW_AT_declaration */
|
||||
+die36: .uleb128 0x4 /* DW_TAG_typedef */
|
||||
+ .string "u" /* DW_AT_name */
|
||||
+ .long die7e-d /* DW_AT_type */
|
||||
+die3f: .uleb128 0x5 /* DW_TAG_variable */
|
||||
+ .string "f" /* DW_AT_name */
|
||||
+ .long .LASF0 /* DW_AT_MIPS_linkage_name */
|
||||
+ .long die36-d /* DW_AT_type */
|
||||
+ .byte 0x1 /* DW_AT_external */
|
||||
+ .byte 0x1 /* DW_AT_declaration */
|
||||
+die4e: .uleb128 0x5 /* DW_TAG_variable */
|
||||
+ .string "c" /* DW_AT_name */
|
||||
+ .long .LASF1 /* DW_AT_MIPS_linkage_name */
|
||||
+ .long die5e-d /* DW_AT_type */
|
||||
+ .byte 0x1 /* DW_AT_external */
|
||||
+ .byte 0x1 /* DW_AT_declaration */
|
||||
+ .byte 0x0
|
||||
+die5e: .uleb128 0x6 /* DW_TAG_class_type */
|
||||
+ .long die32-d /* DW_AT_specification */
|
||||
+ .byte 0x1 /* DW_AT_byte_size */
|
||||
+die6a: .uleb128 0x7 /* DW_TAG_subprogram */
|
||||
+ .byte 0x1 /* DW_AT_external */
|
||||
+ .string "C" /* DW_AT_name */
|
||||
+ .byte 0x1 /* DW_AT_declaration */
|
||||
+die71: .uleb128 0x8 /* DW_TAG_formal_parameter */
|
||||
+ .long die8f-d /* DW_AT_type */
|
||||
+ .byte 0x1 /* DW_AT_artificial */
|
||||
+die77: .uleb128 0x9 /* DW_TAG_formal_parameter */
|
||||
+ .long die7e-d /* DW_AT_type */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+die7e: .uleb128 0xa /* DW_TAG_pointer_type */
|
||||
+ .byte 0x4 /* DW_AT_byte_size */
|
||||
+ .long die84-d /* DW_AT_type */
|
||||
+die84: .uleb128 0xb /* DW_TAG_subroutine_type */
|
||||
+die89: .uleb128 0x9 /* DW_TAG_formal_parameter */
|
||||
+ .long die5e-d /* DW_AT_type */
|
||||
+ .byte 0x0
|
||||
+die8f: .uleb128 0xa /* DW_TAG_pointer_type */
|
||||
+ .byte 0x4 /* DW_AT_byte_size */
|
||||
+ .long die5e-d /* DW_AT_type */
|
||||
+die95: .uleb128 0xc /* DW_TAG_subprogram */
|
||||
+ .long die6a-d /* DW_AT_specification */
|
||||
+ .byte 0x2 /* DW_AT_inline */
|
||||
+die9f: .uleb128 0xd /* DW_TAG_formal_parameter */
|
||||
+ .long .LASF7 /* DW_AT_name */
|
||||
+ .long dieaf-d /* DW_AT_type */
|
||||
+ .byte 0x1 /* DW_AT_artificial */
|
||||
+diea9: .uleb128 0x9 /* DW_TAG_formal_parameter */
|
||||
+ .long die7e-d /* DW_AT_type */
|
||||
+ .byte 0x0
|
||||
+dieaf: .uleb128 0xe /* DW_TAG_const_type */
|
||||
+ .long die8f-d /* DW_AT_type */
|
||||
+dieb4: .uleb128 0xf /* DW_TAG_subprogram */
|
||||
+ .long die95-d /* DW_AT_abstract_origin */
|
||||
+ .long _ZN1N1cE /* DW_AT_low_pc */
|
||||
+ .long _ZN1N1cE /* DW_AT_high_pc */
|
||||
+diec9: .uleb128 0x10 /* DW_TAG_subprogram */
|
||||
+ .long die9f-d /* DW_AT_abstract_origin */
|
||||
+ .byte 2f-1f /* DW_AT_location */
|
||||
+1:
|
||||
+ .byte 0x50 /* DW_OP_reg0 */
|
||||
+2:
|
||||
+died1: .uleb128 0x10 /* DW_TAG_formal_parameter */
|
||||
+ .long diea9-d /* DW_AT_abstract_origin */
|
||||
+ .byte 2f-1f /* DW_AT_location */
|
||||
+1:
|
||||
+ .byte 0x51 /* DW_OP_reg1 */
|
||||
+2:
|
||||
+ .byte 0x0
|
||||
+dieda: .uleb128 0x11 /* DW_TAG_subprogram */
|
||||
+ .byte 0x1 /* DW_AT_external */
|
||||
+ .long .LASF8 /* DW_AT_name */
|
||||
+ .long dief2-d /* DW_AT_type */
|
||||
+ .long _ZN1N1cE /* DW_AT_low_pc */
|
||||
+ .long _ZN1N1cE /* DW_AT_high_pc */
|
||||
+dief2: .uleb128 0x12 /* DW_TAG_base_type */
|
||||
+ .byte 0x4 /* DW_AT_byte_size */
|
||||
+ .byte 0x5 /* DW_AT_encoding */
|
||||
+ .string "int" /* DW_AT_name */
|
||||
+die149: .uleb128 0x16 /* DW_TAG_variable */
|
||||
+ .long die4e-d /* DW_AT_specification */
|
||||
+ .byte 0x5 /* DW_AT_location */
|
||||
+ .byte 0x3
|
||||
+ .long _ZN1N1cE
|
||||
+ .byte 0x0
|
||||
+.Ldebug_info_end:
|
||||
+ .section .debug_abbrev
|
||||
+.Ldebug_abbrev0:
|
||||
+ .uleb128 0x1 /* abbrev code*/
|
||||
+ .uleb128 0x11 /* 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 0x11 /* DW_AT_low_pc */
|
||||
+ .uleb128 0x1 /* DW_FORM_addr */
|
||||
+ .uleb128 0x12 /* DW_AT_high_pc */
|
||||
+ .uleb128 0x1 /* DW_FORM_addr */
|
||||
+ .uleb128 0x52 /* DW_AT_entry_pc */
|
||||
+ .uleb128 0x1 /* DW_FORM_addr */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x2 /* abbrev code */
|
||||
+ .uleb128 0x39 /* DW_TAG_namespace */
|
||||
+ .byte 0x1 /* DW_children_yes */
|
||||
+ .uleb128 0x3 /* DW_AT_name */
|
||||
+ .uleb128 0x8 /* DW_FORM_string */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x3 /* abbrev code */
|
||||
+ .uleb128 0x2 /* DW_TAG_class_type */
|
||||
+ .byte 0x0 /* DW_has_children_no */
|
||||
+ .uleb128 0x3 /* DW_AT_name */
|
||||
+ .uleb128 0x8 /* DW_FORM_string */
|
||||
+ .uleb128 0x3c /* DW_AT_declaration */
|
||||
+ .uleb128 0xc /* DW_FORM_flag */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x4 /* abbrev code */
|
||||
+ .uleb128 0x16 /* DW_TAG_typedef */
|
||||
+ .byte 0x0 /* DW_has_children_no */
|
||||
+ .uleb128 0x3 /* DW_AT_name */
|
||||
+ .uleb128 0x8 /* DW_FORM_string */
|
||||
+ .uleb128 0x49 /* DW_AT_type */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x5 /* abbrev code */
|
||||
+ .uleb128 0x34 /* DW_TAG_variable */
|
||||
+ .byte 0x0 /* DW_has_children_no */
|
||||
+ .uleb128 0x3 /* DW_AT_name */
|
||||
+ .uleb128 0x8 /* DW_FORM_string */
|
||||
+ .uleb128 0x2007 /* DW_AT_MIPS_linkage_name */
|
||||
+ .uleb128 0xe /* DW_FORM_strp */
|
||||
+ .uleb128 0x49 /* DW_AT_TYPE */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .uleb128 0x3f /* DW_AT_external */
|
||||
+ .uleb128 0xc /* DW_FORM_flag */
|
||||
+ .uleb128 0x3c /* DW_AT_declaration */
|
||||
+ .uleb128 0xc /* DW_FORM_flag */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x6 /* abbrev code */
|
||||
+ .uleb128 0x2 /* DW_TAG_class_type */
|
||||
+ .byte 0x1 /* DW_has_children_yes */
|
||||
+ .uleb128 0x47 /* DW_AT_specification */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .uleb128 0xb /* DW_AT_byte_size */
|
||||
+ .uleb128 0xb /* DW_FORM_data1 */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x7 /* abbrev code */
|
||||
+ .uleb128 0x2e /* DW_TAG_subprogra */
|
||||
+ .byte 0x1 /* DW_has_children_yes */
|
||||
+ .uleb128 0x3f /* DW_AT_external */
|
||||
+ .uleb128 0xc /* DW_FORM_flag */
|
||||
+ .uleb128 0x3 /* DW_AT_name */
|
||||
+ .uleb128 0x8 /* DW_FORM_string */
|
||||
+ .uleb128 0x3c /* DW_AT_declaration */
|
||||
+ .uleb128 0xc /* DW_FORM_flag */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x8 /* abbrev code */
|
||||
+ .uleb128 0x5 /* DW_TAG_formal_parameter */
|
||||
+ .byte 0x0 /* DW_has_children_no */
|
||||
+ .uleb128 0x49 /* DW_AT_type */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .uleb128 0x34 /* DW_AT_artificial */
|
||||
+ .uleb128 0xc /* DW_FORM_flag */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x9 /* abbrev code */
|
||||
+ .uleb128 0x5 /* DW_TAG_formal_parameter */
|
||||
+ .byte 0x0 /* DW_has_children_no */
|
||||
+ .uleb128 0x49 /* DW_AT_type */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0xa /* abbrev code */
|
||||
+ .uleb128 0xf /* DW_TAG_pointer_type */
|
||||
+ .byte 0x0 /* DW_has_children_no */
|
||||
+ .uleb128 0xb /* DW_AT_byte_size */
|
||||
+ .uleb128 0xb /* DW_FORM_data1 */
|
||||
+ .uleb128 0x49 /* DW_AT_type */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0xb /* abbrev code */
|
||||
+ .uleb128 0x15 /* DW_TAG_subroutine_type */
|
||||
+ .byte 0x1 /* DW_has_children_yes */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0xc /* abbrev code */
|
||||
+ .uleb128 0x2e /* DW_TAG_subprogram */
|
||||
+ .byte 0x1 /* DW_has_children_yes */
|
||||
+ .uleb128 0x47 /* DW_AT_specification */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .uleb128 0x20 /* DW_AT_inline */
|
||||
+ .uleb128 0xb /* DW_FORM_data1 */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0xd /* abbrev code */
|
||||
+ .uleb128 0x5 /* DW_TAG_formal_parameter */
|
||||
+ .byte 0x0 /* DW_has_children_no */
|
||||
+ .uleb128 0x3 /* DW_AT_name */
|
||||
+ .uleb128 0xe /* DW_FORM_strp */
|
||||
+ .uleb128 0x49 /* DW_AT_type */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .uleb128 0x34 /* DW_AT_artificial */
|
||||
+ .uleb128 0xc /* DW_FORM_flag */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0xe /* abbrev code */
|
||||
+ .uleb128 0x26 /* DW_TAG_const_type */
|
||||
+ .byte 0x0 /* DW_has_children_no */
|
||||
+ .uleb128 0x49 /* DW_AT_type */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0xf /* abbrev code */
|
||||
+ .uleb128 0x2e /* DW_TAG_subprogram */
|
||||
+ .byte 0x1 /* DW_has_children_yes */
|
||||
+ .uleb128 0x31 /* DW_AT_abstract_origin */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .uleb128 0x11 /* DW_AT_low_pc */
|
||||
+ .uleb128 0x1 /* DW_FORM_addr */
|
||||
+ .uleb128 0x12 /* DW_AT_high_pc */
|
||||
+ .uleb128 0x1 /* DW_FORM_addr */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x10 /* abbrev code */
|
||||
+ .uleb128 0x5 /* DW_TAG_formal_parameter */
|
||||
+ .byte 0x0 /* DW_has_children_no */
|
||||
+ .uleb128 0x31 /* DW_AT_abstract_origin */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .uleb128 0x2 /* DW_AT_location */
|
||||
+ .uleb128 0xa /* DW_FORM_block1 */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x11 /* abbrev code */
|
||||
+ .uleb128 0x2e /* DW_TAG_subprogram */
|
||||
+ .byte 0x0 /* DW_has_children_no */
|
||||
+ .uleb128 0x3f /* DW_AT_external */
|
||||
+ .uleb128 0xc /* DW_FORM_flag */
|
||||
+ .uleb128 0x3 /* DW_AT_name */
|
||||
+ .uleb128 0xe /* DW_FORM_strp */
|
||||
+ .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 0x1 /* DW_FORM_addr */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x12 /* abbrev code */
|
||||
+ .uleb128 0x24 /* DW_TAG_base_type */
|
||||
+ .byte 0x0 /* DW_has_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 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x16 /* abbrev code */
|
||||
+ .uleb128 0x34 /* DW_TAG_variable */
|
||||
+ .byte 0x0 /* DW_has_children_no */
|
||||
+ .uleb128 0x47 /* DW_AT_specification */
|
||||
+ .uleb128 0x13 /* DW_FORM_ref4 */
|
||||
+ .uleb128 0x2 /* DW_AT_location */
|
||||
+ .uleb128 0xa /* DW_FORM_block1 */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .section .debug_str
|
||||
+.LASF0:
|
||||
+ .string "_ZN1N1fE"
|
||||
+.LASF7:
|
||||
+ .string "this"
|
||||
+.LASF6:
|
||||
+ .string ""
|
||||
+.LASF8:
|
||||
+ .string "main"
|
||||
+.LASF1:
|
||||
+ .string "_ZN1N1cE"
|
||||
+.LASF5:
|
||||
+ .string "pr11465.cc"
|
||||
+.LASF4:
|
||||
+ .string "GNU C++ 4.4.2"
|
||||
+ .ident "GCC: (GNU) 4.4.2"
|
||||
--- ./gdb/testsuite/gdb.dwarf2/pr11465.exp 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ ./gdb/testsuite/gdb.dwarf2/pr11465.exp 2010-05-13 18:39:00.000000000 +0200
|
||||
@@ -0,0 +1,39 @@
|
||||
+# Copyright 2010 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 can only be run on targets which support DWARF-2 and use gas.
|
||||
+# For now pick a sampling of likely targets.
|
||||
+if {![istarget *-*-linux*]
|
||||
+ && ![istarget *-*-gnu*]
|
||||
+ && ![istarget *-*-elf*]
|
||||
+ && ![istarget *-*-openbsd*]
|
||||
+ && ![istarget arm-*-eabi*]
|
||||
+ && ![istarget powerpc-*-eabi*]} {
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+set testfile "pr11465"
|
||||
+set srcfile ${testfile}.S
|
||||
+set executable ${testfile}.x
|
||||
+set binfile ${objdir}/${subdir}/${executable}
|
||||
+
|
||||
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {}] != "" } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+clean_restart $executable
|
||||
+
|
||||
+# Test delayed physname computations
|
||||
+gdb_test "p N::c.C" { = {void \(N::C \*, void \(\*\)\(N::C\)\)}.*}
|
187
gdb-bz575292-void-workaround.patch
Normal file
187
gdb-bz575292-void-workaround.patch
Normal file
@ -0,0 +1,187 @@
|
||||
http://sourceware.org/ml/gdb-patches/2010-03/msg01039.html
|
||||
Subject: [patch] Fix crash on NULL function's TYPE_FIELD_TYPE
|
||||
|
||||
Hi,
|
||||
|
||||
seen one possibility of a crash.
|
||||
|
||||
#0 c_print_type (type=0x0, ...)
|
||||
#1 in c_type_print_args (type=0xfceb890,
|
||||
|
||||
(The real reason of a reported GDB crash was different, though.)
|
||||
|
||||
|
||||
Thanks,
|
||||
Jan
|
||||
|
||||
|
||||
gdb/
|
||||
2010-03-30 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Fix crash on reading wrong function declaration DWARF.
|
||||
* dwarf2read.c (read_subroutine_type): New variable void_type.
|
||||
Pre-fill all TYPE_FIELD_TYPEs. Move nparams and iparams initialization
|
||||
more close to their use.
|
||||
|
||||
gdb/testsuite/
|
||||
2010-03-30 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.dwarf2/dw2-bad-parameter-type.exp,
|
||||
gdb.dwarf2/dw2-bad-parameter-type.S: New.
|
||||
|
||||
--- a/gdb/dwarf2read.c
|
||||
+++ b/gdb/dwarf2read.c
|
||||
@@ -5938,13 +5938,14 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu)
|
||||
|
||||
if (die->child != NULL)
|
||||
{
|
||||
+ struct type *void_type = objfile_type (cu->objfile)->builtin_void;
|
||||
struct die_info *child_die;
|
||||
- int nparams = 0;
|
||||
- int iparams = 0;
|
||||
+ int nparams, iparams;
|
||||
|
||||
/* Count the number of parameters.
|
||||
FIXME: GDB currently ignores vararg functions, but knows about
|
||||
vararg member functions. */
|
||||
+ nparams = 0;
|
||||
child_die = die->child;
|
||||
while (child_die && child_die->tag)
|
||||
{
|
||||
@@ -5960,6 +5961,12 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu)
|
||||
TYPE_FIELDS (ftype) = (struct field *)
|
||||
TYPE_ZALLOC (ftype, nparams * sizeof (struct field));
|
||||
|
||||
+ /* TYPE_FIELD_TYPE must never be NULL. Pre-fill the array to ensure it
|
||||
+ even if we error out during the parameters reading below. */
|
||||
+ for (iparams = 0; iparams < nparams; iparams++)
|
||||
+ TYPE_FIELD_TYPE (ftype, iparams) = void_type;
|
||||
+
|
||||
+ iparams = 0;
|
||||
child_die = die->child;
|
||||
while (child_die && child_die->tag)
|
||||
{
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/dw2-bad-parameter-type.S
|
||||
@@ -0,0 +1,73 @@
|
||||
+/* Copyright 2010 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/>. */
|
||||
+
|
||||
+ .section .debug_info
|
||||
+debug_start:
|
||||
+ .long debug_end - 1f /* Length of Compilation Unit Info */
|
||||
+1:
|
||||
+ .2byte 0x3 /* DWARF version number */
|
||||
+ .long .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
|
||||
+ .byte 0x4 /* Pointer Size (in bytes) */
|
||||
+ .uleb128 0x1 /* (DIE (0xb) DW_TAG_compile_unit) */
|
||||
+ .ascii "GNU C 4.4.3\0" /* DW_AT_producer */
|
||||
+ .byte 0x1 /* DW_AT_language */
|
||||
+ .ascii "1.c\0" /* DW_AT_name */
|
||||
+ .uleb128 0x4 /* (DIE (0x3c) DW_TAG_subprogram) */
|
||||
+ .ascii "f\0" /* DW_AT_name */
|
||||
+/* Value 0 would require has_section_at_zero != 0 (which is true, though). */
|
||||
+ .long 1 /* DW_AT_low_pc */
|
||||
+ .long 2 /* DW_AT_high_pc */
|
||||
+ .byte 0x1 /* DW_AT_prototyped */
|
||||
+ .uleb128 0x5 /* (DIE (0x42) DW_TAG_formal_parameter) */
|
||||
+/* Invalid value. */
|
||||
+ .long 0x0 /* DW_AT_type */
|
||||
+ .byte 0x0 /* end of children of DIE 0x3c */
|
||||
+ .byte 0x0 /* end of children of DIE 0xb */
|
||||
+debug_end:
|
||||
+
|
||||
+ .section .debug_abbrev
|
||||
+.Ldebug_abbrev0:
|
||||
+ .uleb128 0x1 /* (abbrev code) */
|
||||
+ .uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */
|
||||
+ .byte 0x1 /* DW_children_yes */
|
||||
+ .uleb128 0x25 /* (DW_AT_producer) */
|
||||
+ .uleb128 0x8 /* (DW_FORM_string) */
|
||||
+ .uleb128 0x13 /* (DW_AT_language) */
|
||||
+ .uleb128 0xb /* (DW_FORM_data1) */
|
||||
+ .uleb128 0x3 /* (DW_AT_name) */
|
||||
+ .uleb128 0x8 /* (DW_FORM_string) */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x4 /* (abbrev code) */
|
||||
+ .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */
|
||||
+ .byte 0x1 /* DW_children_yes */
|
||||
+ .uleb128 0x3 /* (DW_AT_name) */
|
||||
+ .uleb128 0x8 /* (DW_FORM_string) */
|
||||
+ .uleb128 0x11 /* (DW_AT_low_pc) */
|
||||
+ .uleb128 0x1 /* (DW_FORM_addr) */
|
||||
+ .uleb128 0x12 /* (DW_AT_high_pc) */
|
||||
+ .uleb128 0x1 /* (DW_FORM_addr) */
|
||||
+ .uleb128 0x27 /* (DW_AT_prototyped) */
|
||||
+ .uleb128 0xc /* (DW_FORM_flag) */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .uleb128 0x5 /* (abbrev code) */
|
||||
+ .uleb128 0x5 /* (TAG: DW_TAG_formal_parameter) */
|
||||
+ .byte 0x0 /* DW_children_no */
|
||||
+ .uleb128 0x49 /* (DW_AT_type) */
|
||||
+ .uleb128 0x13 /* (DW_FORM_ref4) */
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
+ .byte 0x0
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/dw2-bad-parameter-type.exp
|
||||
@@ -0,0 +1,44 @@
|
||||
+# Copyright 2010 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 can only be run on targets which support DWARF-2 and use gas.
|
||||
+# For now pick a sampling of likely targets.
|
||||
+if {![istarget *-*-linux*]
|
||||
+ && ![istarget *-*-gnu*]
|
||||
+ && ![istarget *-*-elf*]
|
||||
+ && ![istarget *-*-openbsd*]
|
||||
+ && ![istarget arm-*-eabi*]
|
||||
+ && ![istarget powerpc-*-eabi*]} {
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+set testfile "dw2-bad-parameter-type"
|
||||
+set srcfile ${testfile}.S
|
||||
+set executable ${testfile}.x
|
||||
+set binfile ${objdir}/${subdir}/${executable}
|
||||
+
|
||||
+# First try referencing DW_AT_frame_base which is not defined.
|
||||
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {}] != "" } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+clean_restart $executable
|
||||
+
|
||||
+# The first access (as we do not use -readnow) prints some:
|
||||
+# Dwarf Error: Cannot find DIE at 0x0 referenced from DIE at 0x29 [in module ...]
|
||||
+gdb_test "ptype f"
|
||||
+
|
||||
+gdb_test "ptype f"
|
||||
+gdb_test "p 5" " = 5" "is alive"
|
||||
|
16
gdb-moribund-utrace-workaround.patch
Normal file
16
gdb-moribund-utrace-workaround.patch
Normal file
@ -0,0 +1,16 @@
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=590623
|
||||
http://sources.redhat.com/bugzilla/show_bug.cgi?id=11593
|
||||
|
||||
Bug in FSF GDB exploited by the ptrace-on-utrace interaction.
|
||||
|
||||
--- a/gdb/breakpoint.c
|
||||
+++ b/gdb/breakpoint.c
|
||||
@@ -9084,6 +9084,8 @@ update_global_location_list (int should_insert)
|
||||
traps we can no longer explain. */
|
||||
|
||||
old_loc->events_till_retirement = 3 * (thread_count () + 1);
|
||||
+ /* Red Hat Bug 590623. */
|
||||
+ old_loc->events_till_retirement *= 10;
|
||||
old_loc->owner = NULL;
|
||||
|
||||
VEC_safe_push (bp_location_p, moribund_locations, old_loc);
|
46
gdb-unwind-debughook-safe-fail.patch
Normal file
46
gdb-unwind-debughook-safe-fail.patch
Normal file
@ -0,0 +1,46 @@
|
||||
commit 802214c97d1661ad337aad0d011dded44f0b5ddd
|
||||
Author: Tom Tromey <tromey@redhat.com>
|
||||
Date: Mon Apr 26 15:15:55 2010 -0600
|
||||
|
||||
Fail gracefully if the _Unwind_DebugHook argument is optimized out
|
||||
|
||||
diff --git a/gdb/infrun.c b/gdb/infrun.c
|
||||
index 2eea550..9a5b534 100644
|
||||
--- a/gdb/infrun.c
|
||||
+++ b/gdb/infrun.c
|
||||
@@ -4925,20 +4925,24 @@ insert_exception_resume_breakpoint (struct thread_info *tp,
|
||||
|
||||
vsym = lookup_symbol (SYMBOL_LINKAGE_NAME (sym), b, VAR_DOMAIN, NULL);
|
||||
value = read_var_value (vsym, frame);
|
||||
- handler = value_as_address (value);
|
||||
+ /* If the value was optimized out, revert to the old behavior. */
|
||||
+ if (! value_optimized_out (value))
|
||||
+ {
|
||||
+ handler = value_as_address (value);
|
||||
|
||||
- /* We're going to replace the current step-resume breakpoint
|
||||
- with an exception-resume breakpoint. */
|
||||
- delete_step_resume_breakpoint (tp);
|
||||
+ /* We're going to replace the current step-resume breakpoint
|
||||
+ with an exception-resume breakpoint. */
|
||||
+ delete_step_resume_breakpoint (tp);
|
||||
|
||||
- if (debug_infrun)
|
||||
- fprintf_unfiltered (gdb_stdlog,
|
||||
- "infrun: exception resume at %lx\n",
|
||||
- (unsigned long) handler);
|
||||
+ if (debug_infrun)
|
||||
+ fprintf_unfiltered (gdb_stdlog,
|
||||
+ "infrun: exception resume at %lx\n",
|
||||
+ (unsigned long) handler);
|
||||
|
||||
- bp = set_momentary_breakpoint_at_pc (get_frame_arch (frame),
|
||||
- handler, bp_exception_resume);
|
||||
- inferior_thread ()->step_resume_breakpoint = bp;
|
||||
+ bp = set_momentary_breakpoint_at_pc (get_frame_arch (frame),
|
||||
+ handler, bp_exception_resume);
|
||||
+ inferior_thread ()->step_resume_breakpoint = bp;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
235
gdb-unwind-debughook-step-independent.patch
Normal file
235
gdb-unwind-debughook-step-independent.patch
Normal file
@ -0,0 +1,235 @@
|
||||
commit f8ca03e0097ae49c66cf33a50e3247bccd3a4a33
|
||||
Author: Tom Tromey <tromey@redhat.com>
|
||||
Date: Wed Apr 28 14:17:38 2010 -0600
|
||||
|
||||
Reimplement infrun parts of next-over-throw.
|
||||
Previously, we reset the step-resume breakpoint.
|
||||
However, this can do the wrong thing if an exception
|
||||
is thrown and caught beneath the nexting frame.
|
||||
The new approach is to have a separate exception-resume
|
||||
breakpoint.
|
||||
|
||||
diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h
|
||||
index 611dcbb..9638368 100644
|
||||
--- a/gdb/gdbthread.h
|
||||
+++ b/gdb/gdbthread.h
|
||||
@@ -66,6 +66,9 @@ struct thread_info
|
||||
/* Step-resume or longjmp-resume breakpoint. */
|
||||
struct breakpoint *step_resume_breakpoint;
|
||||
|
||||
+ /* Exception-resume breakpoint. */
|
||||
+ struct breakpoint *exception_resume_breakpoint;
|
||||
+
|
||||
/* Range to single step within.
|
||||
|
||||
If this is nonzero, respond to a single-step signal by continuing
|
||||
@@ -225,6 +228,9 @@ extern void delete_thread_silent (ptid_t);
|
||||
/* Delete a step_resume_breakpoint from the thread database. */
|
||||
extern void delete_step_resume_breakpoint (struct thread_info *);
|
||||
|
||||
+/* Delete an exception_resume_breakpoint from the thread database. */
|
||||
+extern void delete_exception_resume_breakpoint (struct thread_info *);
|
||||
+
|
||||
/* Translate the integer thread id (GDB's homegrown id, not the system's)
|
||||
into a "pid" (which may be overloaded with extra thread information). */
|
||||
extern ptid_t thread_id_to_pid (int);
|
||||
diff --git a/gdb/infrun.c b/gdb/infrun.c
|
||||
index 9a5b534..3546cf1 100644
|
||||
--- a/gdb/infrun.c
|
||||
+++ b/gdb/infrun.c
|
||||
@@ -300,6 +300,7 @@ follow_fork (void)
|
||||
parent thread structure's run control related fields, not just these.
|
||||
Initialized to avoid "may be used uninitialized" warnings from gcc. */
|
||||
struct breakpoint *step_resume_breakpoint = NULL;
|
||||
+ struct breakpoint *exception_resume_breakpoint = NULL;
|
||||
CORE_ADDR step_range_start = 0;
|
||||
CORE_ADDR step_range_end = 0;
|
||||
struct frame_id step_frame_id = { 0 };
|
||||
@@ -352,6 +353,8 @@ follow_fork (void)
|
||||
step_range_start = tp->step_range_start;
|
||||
step_range_end = tp->step_range_end;
|
||||
step_frame_id = tp->step_frame_id;
|
||||
+ exception_resume_breakpoint
|
||||
+ = clone_momentary_breakpoint (tp->exception_resume_breakpoint);
|
||||
|
||||
/* For now, delete the parent's sr breakpoint, otherwise,
|
||||
parent/child sr breakpoints are considered duplicates,
|
||||
@@ -362,6 +365,7 @@ follow_fork (void)
|
||||
tp->step_range_start = 0;
|
||||
tp->step_range_end = 0;
|
||||
tp->step_frame_id = null_frame_id;
|
||||
+ delete_exception_resume_breakpoint (tp);
|
||||
}
|
||||
|
||||
parent = inferior_ptid;
|
||||
@@ -403,6 +407,8 @@ follow_fork (void)
|
||||
tp->step_range_start = step_range_start;
|
||||
tp->step_range_end = step_range_end;
|
||||
tp->step_frame_id = step_frame_id;
|
||||
+ tp->exception_resume_breakpoint
|
||||
+ = exception_resume_breakpoint;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -456,6 +462,9 @@ follow_inferior_reset_breakpoints (void)
|
||||
if (tp->step_resume_breakpoint)
|
||||
breakpoint_re_set_thread (tp->step_resume_breakpoint);
|
||||
|
||||
+ if (tp->exception_resume_breakpoint)
|
||||
+ breakpoint_re_set_thread (tp->exception_resume_breakpoint);
|
||||
+
|
||||
/* Reinsert all breakpoints in the child. The user may have set
|
||||
breakpoints after catching the fork, in which case those
|
||||
were never set in the child, but only in the parent. This makes
|
||||
@@ -694,6 +703,7 @@ follow_exec (ptid_t pid, char *execd_pathname)
|
||||
/* If there was one, it's gone now. We cannot truly step-to-next
|
||||
statement through an exec(). */
|
||||
th->step_resume_breakpoint = NULL;
|
||||
+ th->exception_resume_breakpoint = NULL;
|
||||
th->step_range_start = 0;
|
||||
th->step_range_end = 0;
|
||||
|
||||
@@ -2145,6 +2155,7 @@ delete_step_resume_breakpoint_callback (struct thread_info *info, void *data)
|
||||
return 0;
|
||||
|
||||
delete_step_resume_breakpoint (info);
|
||||
+ delete_exception_resume_breakpoint (info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2168,6 +2179,7 @@ delete_step_thread_step_resume_breakpoint (void)
|
||||
stepping. */
|
||||
struct thread_info *tp = inferior_thread ();
|
||||
delete_step_resume_breakpoint (tp);
|
||||
+ delete_exception_resume_breakpoint (tp);
|
||||
}
|
||||
else
|
||||
/* In all-stop mode, delete all step-resume and longjmp-resume
|
||||
@@ -3832,30 +3844,31 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (!gdbarch_get_longjmp_target)\n");
|
||||
fprintf_unfiltered (gdb_stdlog,
|
||||
"infrun: BPSTAT_WHAT_CLEAR_LONGJMP_RESUME\n");
|
||||
|
||||
- gdb_assert (ecs->event_thread->step_resume_breakpoint != NULL);
|
||||
- delete_step_resume_breakpoint (ecs->event_thread);
|
||||
-
|
||||
- if (!what.is_longjmp)
|
||||
+ if (what.is_longjmp)
|
||||
+ {
|
||||
+ gdb_assert (ecs->event_thread->step_resume_breakpoint != NULL);
|
||||
+ delete_step_resume_breakpoint (ecs->event_thread);
|
||||
+ }
|
||||
+ else
|
||||
{
|
||||
/* There are several cases to consider.
|
||||
-
|
||||
+
|
||||
1. The initiating frame no longer exists. In this case
|
||||
we must stop, because the exception has gone too far.
|
||||
-
|
||||
+
|
||||
2. The initiating frame exists, and is the same as the
|
||||
- current frame.
|
||||
-
|
||||
- 2.1. If we are stepping, defer to the stepping logic.
|
||||
-
|
||||
- 2.2. Otherwise, we are not stepping, so we are doing a
|
||||
- "finish" and we have reached the calling frame. So,
|
||||
- stop.
|
||||
-
|
||||
+ current frame. We stop, because the exception has been
|
||||
+ caught.
|
||||
+
|
||||
3. The initiating frame exists and is different from
|
||||
the current frame. This means the exception has been
|
||||
caught beneath the initiating frame, so keep going. */
|
||||
struct frame_info *init_frame
|
||||
= frame_find_by_id (ecs->event_thread->initiating_frame);
|
||||
+
|
||||
+ gdb_assert (ecs->event_thread->exception_resume_breakpoint != NULL);
|
||||
+ delete_exception_resume_breakpoint (ecs->event_thread);
|
||||
+
|
||||
if (init_frame)
|
||||
{
|
||||
struct frame_id current_id
|
||||
@@ -3863,15 +3876,7 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (!gdbarch_get_longjmp_target)\n");
|
||||
if (frame_id_eq (current_id,
|
||||
ecs->event_thread->initiating_frame))
|
||||
{
|
||||
- if (ecs->event_thread->step_range_start)
|
||||
- {
|
||||
- /* Case 2.1. */
|
||||
- break;
|
||||
- }
|
||||
- else
|
||||
- {
|
||||
- /* Case 2.2: fall through. */
|
||||
- }
|
||||
+ /* Case 2. Fall through. */
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3880,6 +3885,10 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (!gdbarch_get_longjmp_target)\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ /* For Cases 1 and 2, remove the step-resume breakpoint,
|
||||
+ if it exists. */
|
||||
+ delete_step_resume_breakpoint (ecs->event_thread);
|
||||
}
|
||||
|
||||
ecs->event_thread->stop_step = 1;
|
||||
@@ -4930,10 +4939,6 @@ insert_exception_resume_breakpoint (struct thread_info *tp,
|
||||
{
|
||||
handler = value_as_address (value);
|
||||
|
||||
- /* We're going to replace the current step-resume breakpoint
|
||||
- with an exception-resume breakpoint. */
|
||||
- delete_step_resume_breakpoint (tp);
|
||||
-
|
||||
if (debug_infrun)
|
||||
fprintf_unfiltered (gdb_stdlog,
|
||||
"infrun: exception resume at %lx\n",
|
||||
@@ -4941,7 +4946,7 @@ insert_exception_resume_breakpoint (struct thread_info *tp,
|
||||
|
||||
bp = set_momentary_breakpoint_at_pc (get_frame_arch (frame),
|
||||
handler, bp_exception_resume);
|
||||
- inferior_thread ()->step_resume_breakpoint = bp;
|
||||
+ inferior_thread ()->exception_resume_breakpoint = bp;
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/gdb/testsuite/gdb.cp/gdb9593.exp b/gdb/testsuite/gdb.cp/gdb9593.exp
|
||||
index ee9aeff..c77dbd8 100644
|
||||
--- a/gdb/testsuite/gdb.cp/gdb9593.exp
|
||||
+++ b/gdb/testsuite/gdb.cp/gdb9593.exp
|
||||
@@ -145,7 +145,7 @@ gdb_test "step" \
|
||||
"step into finish, for until"
|
||||
|
||||
gdb_test "until" \
|
||||
- ".*catch .int x.*" \
|
||||
+ ".*function1 ().*" \
|
||||
"until with no argument 1"
|
||||
|
||||
set line [gdb_get_line_number "marker for until" $testfile.cc]
|
||||
diff --git a/gdb/thread.c b/gdb/thread.c
|
||||
index 16a207c..3c52ae4 100644
|
||||
--- a/gdb/thread.c
|
||||
+++ b/gdb/thread.c
|
||||
@@ -90,6 +90,16 @@ delete_step_resume_breakpoint (struct thread_info *tp)
|
||||
}
|
||||
}
|
||||
|
||||
+void
|
||||
+delete_exception_resume_breakpoint (struct thread_info *tp)
|
||||
+{
|
||||
+ if (tp && tp->exception_resume_breakpoint)
|
||||
+ {
|
||||
+ delete_breakpoint (tp->exception_resume_breakpoint);
|
||||
+ tp->exception_resume_breakpoint = NULL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void
|
||||
clear_thread_inferior_resources (struct thread_info *tp)
|
||||
{
|
@ -801,3 +801,24 @@ http://sourceware.org/ml/gdb-cvs/2010-04/msg00029.html
|
||||
+
|
||||
+gdb_breakpoint "main"
|
||||
+gdb_continue_to_breakpoint "main" "main.*"
|
||||
|
||||
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=590648
|
||||
Re: [rfc] Work around invalid G++ DWARF for unnamed aggregates
|
||||
http://sourceware.org/ml/gdb-patches/2010-03/msg00909.html
|
||||
commit 5e40af195bd74a66d300d8f481cab1f2ba533f3a
|
||||
|
||||
[ cut only a part of it ]
|
||||
|
||||
--- a/gdb/completer.c
|
||||
+++ b/gdb/completer.c
|
||||
@@ -401,7 +401,7 @@ add_struct_fields (struct type *type, int *nextp, char **output,
|
||||
computed_type_name = 1;
|
||||
}
|
||||
/* Omit constructors from the completion list. */
|
||||
- if (type_name && strcmp (type_name, name))
|
||||
+ if (!type_name || strcmp (type_name, name))
|
||||
{
|
||||
output[*nextp] = xstrdup (name);
|
||||
++*nextp;
|
||||
|
@ -1,3 +1,8 @@
|
||||
-------------------------------------------------------------------
|
||||
Fri May 21 12:17:19 UTC 2010 - rguenther@novell.com
|
||||
|
||||
- Merge from gdb-7.1-20.fc13.src.rpm.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Apr 22 19:13:48 UTC 2010 - aj@suse.de
|
||||
|
||||
|
43
gdb.spec
43
gdb.spec
@ -24,7 +24,7 @@ Name: gdb
|
||||
# NOTE: the FSF gdb versions are numbered N.M for official releases, like 6.3
|
||||
# and, since January 2005, X.Y.Z.date for daily snapshots, like 6.3.50.20050112 # (daily snapshot from mailine), or 6.3.0.20040112 (head of the release branch).
|
||||
Version: 7.1
|
||||
Release: 2
|
||||
Release: 3
|
||||
|
||||
# The release always contains a leading reserved number, start it at 1.
|
||||
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
||||
@ -433,8 +433,35 @@ Patch447: gdb-bz578250-avx-09of10.patch
|
||||
Patch448: gdb-bz578250-avx-10of10.patch
|
||||
Patch449: gdb-bz578250-avx-10of10-ppc.patch
|
||||
|
||||
# Fix crash on C++ types in some debug info files (BZ 575292, Keith Seitz).
|
||||
# Temporarily workaround the crash of BZ 575292 as there was now BZ 585445.
|
||||
# Re-enable the BZ 575292 and BZ 585445 C++ fix using an updated patch.
|
||||
Patch451: gdb-bz575292-delayed-physname.patch
|
||||
Patch455: gdb-bz575292-void-workaround.patch
|
||||
|
||||
# Pretty printers not well documented (BZ 570635, Tom Tromey, Jan Kratochvil).
|
||||
Patch452: gdb-bz570635-prettyprint-doc1.patch
|
||||
Patch453: gdb-bz570635-prettyprint-doc2.patch
|
||||
|
||||
# Fix crash when using GNU IFUNC call from breakpoint condition.
|
||||
Patch454: gdb-bz539590-gnu-ifunc-fix-cond.patch
|
||||
|
||||
# Fail gracefully if the _Unwind_DebugHook arg. is optimized out (Tom Tromey).
|
||||
# Make _Unwind_DebugHook independent from step-resume breakpoint (Tom Tromey).
|
||||
Patch456: gdb-unwind-debughook-safe-fail.patch
|
||||
Patch457: gdb-unwind-debughook-step-independent.patch
|
||||
|
||||
# testsuite: Fix gdb.base/vla-overflow.exp FAILing on s390x (BZ 590635).
|
||||
Patch458: gdb-archer-vla-test-oom.patch
|
||||
|
||||
# Workaround non-stop moribund locations exploited by kernel utrace (BZ 590623).
|
||||
Patch459: gdb-moribund-utrace-workaround.patch
|
||||
|
||||
# Fix crash on VLA bound referencing an optimized-out variable (BZ 591879).
|
||||
Patch460: gdb-archer-vla-ref-optimizedout.patch
|
||||
|
||||
# Upstream patch to fix gcc -Werror
|
||||
Patch500: gdb-7.1-werror.patch
|
||||
Patch1001: gdb-7.1-werror.patch
|
||||
|
||||
# Fix readline 5.1 warnings
|
||||
Patch1000: readline-5.1-random.patch
|
||||
@ -664,9 +691,19 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
|
||||
%patch447 -p1
|
||||
%patch448 -p1
|
||||
%patch449 -p1
|
||||
%patch500 -p0
|
||||
%patch451 -p1
|
||||
%patch452 -p1
|
||||
%patch453 -p1
|
||||
%patch454 -p1
|
||||
%patch455 -p1
|
||||
%patch456 -p1
|
||||
%patch457 -p1
|
||||
%patch458 -p1
|
||||
%patch459 -p1
|
||||
%patch460 -p1
|
||||
|
||||
%patch1000
|
||||
%patch1001 -p0
|
||||
%patch1002 -p1
|
||||
|
||||
find -name "*.orig" | xargs rm -f
|
||||
|
Loading…
x
Reference in New Issue
Block a user