[gdb] Rebase to FSF GDB 7.7.91.20140721 (pre-7.8 snapshot).

Jan Kratochvil jankratochvil at fedoraproject.org
Tue Jul 22 18:38:50 UTC 2014


commit a972d47b4c2f40fb5a7564a83e13ea31349bcc54
Author: Jan Kratochvil <jan.kratochvil at redhat.com>
Date:   Tue Jul 22 20:38:38 2014 +0200

    Rebase to FSF GDB 7.7.91.20140721 (pre-7.8 snapshot).
    
    - Rebase the Intel VLA patchset.
    - New fix of the optimized-out entry data values crash (BZ 1111910).
    - [testsuite] Fix paginate-*.exp race for "read1".

 .gitignore                                         |    2 +-
 gdb-entryval-crash-1of3.patch                      |  194 +++++++++
 gdb-entryval-crash-2of3.patch                      |   44 ++
 ...mizedout.patch => gdb-entryval-crash-3of3.patch |   47 +---
 gdb-testsuite-pagination-read1.patch               |  415 ++++++++++++++++++++
 gdb-upstream.patch                                 |  372 ------------------
 gdb-vla-intel.patch                                |  281 ++++++--------
 gdb.spec                                           |   24 +-
 sources                                            |    2 +-
 9 files changed, 801 insertions(+), 580 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 1e24b85..bb0d7a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
 /gdb-libstdc++-v3-python-r155978.tar.bz2
-/gdb-7.7.90.20140711.tar.bz2
+/gdb-7.7.91.20140721.tar.bz2
diff --git a/gdb-entryval-crash-1of3.patch b/gdb-entryval-crash-1of3.patch
new file mode 100644
index 0000000..58fd34c
--- /dev/null
+++ b/gdb-entryval-crash-1of3.patch
@@ -0,0 +1,194 @@
+http://sourceware.org/ml/gdb-patches/2014-07/msg00530.html
+Subject: [read_frame_arg patch] Handle partially optimized out values similarly to unavailable values (Re: [patchv2] Fix crash on optimized-out entry data values)
+
+
+--V88s5gaDVPzZ0KCq
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+
+On Thu, 17 Jul 2014 14:23:06 +0200, Pedro Alves wrote:
+> On 07/16/2014 10:58 PM, Jan Kratochvil wrote:
+> > This patch is apparently not suitable for gdb-7.8 which is I guess often
+> > crashing on -O2 -g entry values so there could be some rather minimal crash
+> > avoiding patch instead.
+> 
+> Yeah.
+> 
+> So this was originally "caused" (more exposed) by 4f14910f:
+>     
+>         gdb/ChangeLog
+>         2013-11-26  Andrew Burgess  <aburgess at broadcom.com>
+>     
+>             * value.c (allocate_optimized_out_value): Mark value as non-lazy.
+> 
+> I tried a few approaches in value_available_contents_eq
+> today, and ended up thinking that the simplest should be to
+> just revert that patch until we have the fuller fix in place.
+
+OK, that seems as the best solution for 7.8 to me.
+
+
+> While doing just that fixes the crash, it surprisingly causes
+> one of your new tests to FAIL:
+> 
+>  (gdb) frame
+>  #0  bar (ref=ref at entry=@0x7fffffffd184: 10) at gdb.arch/amd64-entry-value-paramref.cc:23
+>  23        vv++; /* break-here */
+>  (gdb) FAIL: gdb.arch/amd64-entry-value-paramref.exp: frame
+
+There is a bug in that entry value code of mine, fix attached.
+The testcase then PASSes with the reverted optimization by Andrew Burgess.
+
+For the attached fix - if you nitpick the missing conditional case:
+	value_optimized_out (val_deref) && value_optimized_out (entryval_deref)
+It is not detected there but that IMO does not matter much as
+ * It is for 7.8 only, for trunk it will get compared correctly thanks to the
+   new implementation of value_available_contents_eq()
+   called value_contents_eq().
+ * If the conditional
+                      if (val != val_deref
+                          && !value_optimized_out (val_deref)
+                          && !value_optimized_out (entryval_deref)
+                          && value_available_contents_eq (val_deref, 0,
+                                                          entryval_deref, 0,
+                                                      TYPE_LENGTH (type_deref)))
+                        val_equal = 1;
+   fails it may just print
+     bar (ref=@0x7fffffffd904: <optimized out>, ref at entry=@0x7fffffffd904: <optimized out>)
+   (or some variant with some partially optimized-out/unavailable parts)
+   instead of the more correct
+     bar (ref=ref at entry=@0x7fffffffd904: <optimized out>)
+   which is not much a bug.
+
+The attached fix no longe makes sense after the new implementation
+of value_available_contents_eq() called value_contents_eq() gets applied as it
+handles all the optimized-out/unavailable values on its own, therefore the
+attached patch is really only for 7.8.
+
+
+> Turns out it's the code disabled in value_of_dwarf_reg_entry:
+> 
+>   target_val = dwarf_entry_parameter_to_value (parameter,
+> 					       TYPE_LENGTH (target_type),
+> 					       target_type, caller_frame,
+> 					       caller_per_cu);
+> 
+>   /* value_as_address dereferences TYPE_CODE_REF.  */
+>   addr = extract_typed_address (value_contents (outer_val), checked_type);
+> 
+>   /* The target entry value has artificial address of the entry value
+>      reference.  */
+>   VALUE_LVAL (target_val) = lval_memory;
+>   set_value_address (target_val, addr);
+> 
+> It looks quite wrong to me to just change a value's lval like that.
+> 
+> I ran the testsuite with that code disabled (like in the patch below),
+> and that caused no regressions.  I can't say I really understand the
+> intention here though.  What would we be missing if we removed that code?
+
+I cannot reproduce any wrong case having the code above #if 0-ed.
+
+I just do not find it correct to have it disabled.  But at the same time I do
+like much / I do not find correct the code myself.  It is a bit problematic to
+have struct value describing a memory content which is no longer present
+there.
+
+What happens there:
+------------------------------------------------------------------------------
+volatile int vv;
+static __attribute__((noinline)) int
+bar (int &ref) {
+  ref = 20;
+  vv++; /* break-here */
+  return ref;
+}
+int main (void) {
+  int var = 10;
+  return bar (var);
+}
+------------------------------------------------------------------------------
+ <4><c7>: Abbrev Number: 13 (DW_TAG_GNU_call_site_parameter)
+    <c8>   DW_AT_location    : 1 byte block: 55         (DW_OP_reg5 (rdi))
+    <ca>   DW_AT_GNU_call_site_value: 2 byte block: 91 74       (DW_OP_fbreg: -12)
+    <cd>   DW_AT_GNU_call_site_data_value: 1 byte block: 3a     (DW_OP_lit10)
+------------------------------------------------------------------------------
+gdb -ex 'b value_addr' -ex r --args ../gdb ./1 -ex 'watch vv' -ex r -ex 'p &ref at entry'
+->
+6    return ref;
+bar (ref=@0x7fffffffd944: 20, ref at entry=@0x7fffffffd944: 10) at 1.C:25
+------------------------------------------------------------------------------
+At /* break-here */ struct value variable 'ref' is TYPE_CODE_REF.
+
+With FSF GDB HEAD:
+(gdb) x/gx arg1.contents
+0x6004000a4ad0: 0x00007fffffffd944
+(gdb) p ((struct value *)arg1.location.computed.closure).lval
+$1 = lval_memory
+(gdb) p/x ((struct value *)arg1.location.computed.closure).location.address
+$3 = 0x7fffffffd944
+
+With your #if0-ed code:
+(gdb) x/gx arg1.contents
+0x6004000a4ad0: 0x00007fffffffd944
+(gdb) p ((struct value *)arg1.location.computed.closure).lval
+$8 = not_lval
+(gdb) p/x ((struct value *)arg1.location.computed.closure).location.address
+$9 = 0x0
+
+I do not see how to access
+	((struct value *)arg1.location.computed.closure).location.address
+from GDB CLI.  Trying
+(gdb) p &ref at entry
+will invoke value_addr()'s:
+  if (TYPE_CODE (type) == TYPE_CODE_REF)
+      /* Copy the value, but change the type from (T&) to (T*).  We
+         keep the same location information, which is efficient, and
+         allows &(&X) to get the location containing the reference.  */
+and therefore the address gets fetched already from
+  arg1.contents
+and not from
+  ((struct value *)arg1.location.computed.closure).location.address
+.
+
+And for any other type than TYPE_CODE_REF this code you #if 0-ed does not get
+executed at all.  This DW_AT_GNU_call_site_data_value DWARF was meant
+primarily for Fortran but with -O0 entry values do not get produced
+and with -Og and higher Fortran always optimizes out the passing by reference.
+
+If you do not like the #if 0 code there I am OK with removing it as I do not
+know how to make it's use reproducible for user anyway.  In the worst case
+- if there really is some way how to exploit it - one should just get
+  Attempt to take address of value not located in memory.
+instead of some wrong value and it may be easy to fix then.
+
+
+Thanks for the analysis,
+Jan
+
+--V88s5gaDVPzZ0KCq
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline; filename=1
+
+gdb/
+2014-07-20  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	* stack.c (read_frame_arg): Verify value_optimized_out before calling
+	value_available_contents_eq.
+
+diff --git a/gdb/stack.c b/gdb/stack.c
+index 0d6d8e7..4db5df5 100644
+--- a/gdb/stack.c
++++ b/gdb/stack.c
+@@ -413,6 +413,8 @@ read_frame_arg (struct symbol *sym, struct frame_info *frame,
+ 		      /* If the reference addresses match but dereferenced
+ 			 content does not match print them.  */
+ 		      if (val != val_deref
++		          && !value_optimized_out (val_deref)
++		          && !value_optimized_out (entryval_deref)
+ 			  && value_available_contents_eq (val_deref, 0,
+ 							  entryval_deref, 0,
+ 						      TYPE_LENGTH (type_deref)))
+
+--V88s5gaDVPzZ0KCq--
+
diff --git a/gdb-entryval-crash-2of3.patch b/gdb-entryval-crash-2of3.patch
new file mode 100644
index 0000000..a3cfe22
--- /dev/null
+++ b/gdb-entryval-crash-2of3.patch
@@ -0,0 +1,44 @@
+revert:
+commit 4f14910fa1331398cc695011a6af43a89252b4b1
+Author: Andrew Burgess <aburgess at broadcom.com>
+Date:   Tue Nov 26 16:21:53 2013 +0000
+
+    Mark entirely optimized out value as non-lazy.
+    
+    If a value is entirely optimized out, then there's nothing for
+    value_fetch_lazy to fetch.  Sequences like:
+    
+     if (value_lazy (retval))
+       value_fetch_lazy (retval);
+    
+    End up allocating the value contents buffer, wasting memory, for no
+    use.
+    
+    gdb/ChangeLog
+    2013-11-26  Andrew Burgess  <aburgess at broadcom.com>
+    
+    	* value.c (allocate_optimized_out_value): Mark value as non-lazy.
+
+### a/gdb/ChangeLog
+### b/gdb/ChangeLog
+## -1,3 +1,7 @@
++2013-11-26  Andrew Burgess  <aburgess at broadcom.com>
++
++	* value.c (allocate_optimized_out_value): Mark value as non-lazy.
++
+ 2013-11-26  Tom Tromey  <tromey at redhat.com>
+ 
+ 	* dwarf2-frame.c (dwarf2_frame_cache): Revert patch from
+diff --git a/gdb/value.c b/gdb/value.c
+index 29abe5f..f073d71 100644
+--- a/gdb/value.c
++++ b/gdb/value.c
+@@ -906,7 +906,7 @@ allocate_optimized_out_value (struct type *type)
+   struct value *retval = allocate_value_lazy (type);
+ 
+   set_value_optimized_out (retval, 1);
+-  set_value_lazy (retval, 0);
++
+   return retval;
+ }
+ 
diff --git a/gdb-entrydataoptimizedout.patch b/gdb-entryval-crash-3of3.patch
similarity index 94%
rename from gdb-entrydataoptimizedout.patch
rename to gdb-entryval-crash-3of3.patch
index c28ff3a..a8ea099 100644
--- a/gdb-entrydataoptimizedout.patch
+++ b/gdb-entryval-crash-3of3.patch
@@ -65,6 +65,7 @@ Content-Disposition: inline; filename="optimfix3.patch"
 gdb/
 2014-07-09  Jan Kratochvil  <jan.kratochvil at redhat.com>
 
+removed:
 	* value.c (struct value): Extend the comment for fields optimized_out
 	and unavailable.
 	(value_available_contents_bits_eq): Handle OPTIMIZED_OUT values as
@@ -80,52 +81,6 @@ gdb/testsuite/
 	* gdb.arch/amd64-optimout-repeat.c: New file.
 	* gdb.arch/amd64-optimout-repeat.exp: New file.
 
-diff --git a/gdb/value.c b/gdb/value.c
-index 557056f..c017c75 100644
---- a/gdb/value.c
-+++ b/gdb/value.c
-@@ -198,12 +198,14 @@ struct value
-   unsigned int lazy : 1;
- 
-   /* If nonzero, this is the value of a variable that does not
--     actually exist in the program.  If nonzero, and LVAL is
-+     actually exist in the program at all.  If nonzero, and LVAL is
-      lval_register, this is a register ($pc, $sp, etc., never a
-      program variable) that has not been saved in the frame.  All
-      optimized-out values are treated pretty much the same, except
-      registers have a different string representation and related
--     error strings.  */
-+     error strings.  When it is zero it still maybe only partially
-+     available (equally partially optimized out) - see the
-+     'unavailable' field below.  */
-   unsigned int optimized_out : 1;
- 
-   /* If value is a variable, is it initialized or not.  */
-@@ -334,7 +336,9 @@ struct value
-      valid if lazy is nonzero.  */
-   gdb_byte *contents;
- 
--  /* Unavailable ranges in CONTENTS.  We mark unavailable ranges,
-+  /* If OPTIMIZED_OUT is nonzero then UNAVAILABLE must be VEC_empty
-+     (not necessarily NULL).  Otherwise it specifies
-+     unavailable ranges in CONTENTS.  We mark unavailable ranges,
-      rather than available, since the common and default case is for a
-      value to be available.  This is filled in at value read time.  The
-      unavailable ranges are tracked in bits.  */
-@@ -701,6 +705,13 @@ value_available_contents_bits_eq (const struct value *val1, int offset1,
-   /* See function description in value.h.  */
-   gdb_assert (!val1->lazy && !val2->lazy);
- 
-+  gdb_assert (!val1->optimized_out || VEC_empty (range_s, val1->unavailable));
-+  gdb_assert (!val2->optimized_out || VEC_empty (range_s, val2->unavailable));
-+  if (val1->optimized_out != val2->optimized_out)
-+    return 0;
-+  if (val1->optimized_out && val2->optimized_out)
-+    return 1;
-+
-   while (length > 0)
-     {
-       range_s *r1, *r2;
 diff --git a/gdb/testsuite/gdb.arch/amd64-entry-value-paramref.S b/gdb/testsuite/gdb.arch/amd64-entry-value-paramref.S
 new file mode 100644
 index 0000000..a1e9d0a
diff --git a/gdb-testsuite-pagination-read1.patch b/gdb-testsuite-pagination-read1.patch
new file mode 100644
index 0000000..58fb132
--- /dev/null
+++ b/gdb-testsuite-pagination-read1.patch
@@ -0,0 +1,415 @@
+http://sourceware.org/ml/gdb-patches/2014-07/msg00553.html
+Subject: [testsuite patch] Fix paginate-*.exp race for "read1"
+
+
+--17pEHd4RhPHOinZp
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+
+Hi Pedro,
+
+these testcase have racy results:
+	gdb.base/double-prompt-target-event-error.exp
+	gdb.base/paginate-after-ctrl-c-running.exp
+	gdb.base/paginate-bg-execution.exp
+	gdb.base/paginate-execution-startup.exp
+	gdb.base/paginate-inferior-exit.exp
+
+reproducible with "read1" from:
+	reproducer for races of expect incomplete reads
+	http://sourceware.org/bugzilla/show_bug.cgi?id=12649
+
+# Prevent gdb_test_multiple considering an error -re "<return>" match.
+# For unknown reason -notransfer -re "<return>" { exp_continue } does not
+# prevent it.
+
+Tested on Fedora 20 x86_64 and Fedora Rawhide x86_64 that -notransfer does not
+work there:
+	expect-5.45-10.fc20.x86_64
+	expect-5.45-16.fc21.x86_64
+
+Sure if someone gets -notransfer working this patch could be dropped.
+
+
+Jan
+
+--17pEHd4RhPHOinZp
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline; filename=1
+
+gdb/testsuite/
+2014-07-22  Jan Kratochvil  <jan.kratochvil at redhat.com>
+
+	* gdb.base/double-prompt-target-event-error.exp: Use
+	gdb_test_pagination.
+	* gdb.base/paginate-after-ctrl-c-running.exp: Likewise.
+	* gdb.base/paginate-bg-execution.exp: Likewise.
+	* gdb.base/paginate-execution-startup.exp: Likewise.
+	* gdb.base/paginate-inferior-exit.exp: Likewise.
+	* lib/gdb.exp (pagination_prompt): Remove.
+	(gdb_test_pagination): New.
+
+diff --git a/gdb/testsuite/gdb.base/double-prompt-target-event-error.exp b/gdb/testsuite/gdb.base/double-prompt-target-event-error.exp
+index 5571cdf..803e256 100644
+--- a/gdb/testsuite/gdb.base/double-prompt-target-event-error.exp
++++ b/gdb/testsuite/gdb.base/double-prompt-target-event-error.exp
+@@ -28,7 +28,7 @@ if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug] == -1} {
+ 
+ proc cancel_pagination_in_target_event { command } {
+     global binfile srcfile
+-    global gdb_prompt pagination_prompt
++    global gdb_prompt
+ 
+     set testline [gdb_get_line_number "after sleep"]
+ 
+@@ -60,25 +60,23 @@ proc cancel_pagination_in_target_event { command } {
+ 
+ 	# Wait for pagination prompt after the "Continuing" line,
+ 	# indicating the program was running and then stopped.
++	global saw_continuing
+ 	set saw_continuing 0
+ 	set test "continue to pagination"
+-	gdb_test_multiple "$command" $test {
+-	    -re "$pagination_prompt$" {
+-		if {$saw_continuing} {
+-		    pass $test
+-		} else {
+-		    send_gdb "\n"
+-		    exp_continue
+-		}
++	gdb_test_pagination $command $test {
++	    global saw_continuing
++	    if {$saw_continuing} {
++		pass $test
++	    } else {
++		send_gdb "\n"
++		exp_continue
+ 	    }
++	} {
+ 	    -re "Continuing" {
++		global saw_continuing
+ 		set saw_continuing 1
+ 		exp_continue
+ 	    }
+-	    -notransfer -re "<return>" {
+-		# Otherwise gdb_test_multiple considers this an error.
+-		exp_continue
+-	    }
+ 	}
+ 
+ 	# We're now stopped in a pagination query while handling a
+@@ -88,15 +86,20 @@ proc cancel_pagination_in_target_event { command } {
+ 	send_gdb "\003p 1\n"
+ 
+ 	set test "no double prompt"
+-	gdb_test_multiple "" $test {
+-	    -re "$gdb_prompt.*$gdb_prompt.*$gdb_prompt $" {
+-		fail $test
+-	    }
+-	    -re "$gdb_prompt .* = 1\r\n$gdb_prompt $" {
++	global saw_prompt
++	set saw_prompt 0
++	gdb_test_pagination "" $test {
++	    exp_continue
++	} {
++	    -re " = 1\r\n$gdb_prompt $" {
+ 		pass $test
+ 	    }
+-	    -notransfer -re "<return>" {
+-		# Otherwise gdb_test_multiple considers this an error.
++	    -re "\r\n$gdb_prompt " {
++		global saw_prompt
++		if { $saw_prompt != 0 } {
++		    fail $test
++		}
++		set saw_prompt 1
+ 		exp_continue
+ 	    }
+ 	}
+diff --git a/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp b/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp
+index 0ed8c92..3323fe7 100644
+--- a/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp
++++ b/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp
+@@ -24,7 +24,6 @@ if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} {
+ 
+ proc test_ctrlc_while_target_running_paginates {} {
+     global binfile srcfile
+-    global gdb_prompt pagination_prompt
+ 
+     set testline [gdb_get_line_number "after sleep"]
+ 
+@@ -61,19 +60,13 @@ proc test_ctrlc_while_target_running_paginates {} {
+ 	# the user can respond to the pagination query.
+ 	set test "got prompt"
+ 	set saw_pagination_prompt 0
+-	gdb_test_multiple "" $test {
+-	    -re "$pagination_prompt$" {
+-		set saw_pagination_prompt 1
+-		send_gdb "\n"
+-		exp_continue
+-	    }
++	gdb_test_pagination "" $test {
++	    send_gdb "\n"
++	    exp_continue
++	} {
+ 	    -re "$gdb_prompt $" {
+ 		gdb_assert $saw_pagination_prompt $test
+ 	    }
+-	    -notransfer -re "<return>" {
+-		# Otherwise gdb_test_multiple considers this an error.
+-		exp_continue
+-	    }
+ 	}
+ 
+ 	# Confirm GDB can still process input.
+diff --git a/gdb/testsuite/gdb.base/paginate-bg-execution.exp b/gdb/testsuite/gdb.base/paginate-bg-execution.exp
+index dcff8ad..3ba46a3 100644
+--- a/gdb/testsuite/gdb.base/paginate-bg-execution.exp
++++ b/gdb/testsuite/gdb.base/paginate-bg-execution.exp
+@@ -27,7 +27,6 @@ if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} {
+ 
+ proc test_bg_execution_pagination_return {} {
+     global binfile
+-    global pagination_prompt
+ 
+     with_test_prefix "paginate" {
+ 	clean_restart $binfile
+@@ -43,21 +42,12 @@ proc test_bg_execution_pagination_return {} {
+ 
+ 	gdb_test "continue&" "Continuing\."
+ 
+-	set test "pagination handled, breakpoint hit"
+-	set saw_pagination_prompt 0
+-	gdb_test_multiple "" $test {
+-	    -re "$pagination_prompt$" {
+-		set saw_pagination_prompt 1
+-		send_gdb "\n"
+-		exp_continue
+-	    }
+-	    -notransfer -re "<return>" {
+-		# Otherwise gdb_test_multiple considers this an
+-		# error.
+-		exp_continue
+-	    }
++	gdb_test_pagination "" "pagination handled, breakpoint hit" {
++	    send_gdb "\n"
++	    exp_continue
++	} {
+ 	    -re "after sleep\[^\r\n\]+\r\n$" {
+-		gdb_assert $saw_pagination_prompt $test
++		gdb_assert { $saw_pagination_prompt == 3 } $test
+ 	    }
+ 	}
+ 
+@@ -75,7 +65,7 @@ proc test_bg_execution_pagination_return {} {
+ 
+ proc test_bg_execution_pagination_cancel { how } {
+     global binfile
+-    global gdb_prompt pagination_prompt
++    global gdb_prompt
+ 
+     with_test_prefix "cancel with $how" {
+ 	clean_restart $binfile
+@@ -92,14 +82,8 @@ proc test_bg_execution_pagination_cancel { how } {
+ 	gdb_test "continue&" "Continuing\."
+ 
+ 	set test "continue& paginates"
+-	gdb_test_multiple "" $test {
+-	    -re "$pagination_prompt$" {
+-		pass $test
+-	    }
+-	    -notransfer -re "<return>" {
+-		# Otherwise gdb_test_multiple considers this an error.
+-		exp_continue
+-	    }
++	gdb_test_pagination "" $test {
++	    pass $test
+ 	}
+ 
+ 	set test "cancel pagination"
+diff --git a/gdb/testsuite/gdb.base/paginate-execution-startup.exp b/gdb/testsuite/gdb.base/paginate-execution-startup.exp
+index dc713ec..4dc2376 100644
+--- a/gdb/testsuite/gdb.base/paginate-execution-startup.exp
++++ b/gdb/testsuite/gdb.base/paginate-execution-startup.exp
+@@ -76,7 +76,6 @@ proc probe_can_run_cmdline  {} {
+ proc test_fg_execution_pagination_return {} {
+     global file_arg
+     global saved_gdbflags GDBFLAGS
+-    global gdb_prompt pagination_prompt
+ 
+     set GDBFLAGS $saved_gdbflags
+     append GDBFLAGS " -ex \"set height 2\""
+@@ -92,10 +91,9 @@ proc test_fg_execution_pagination_return {} {
+ 	    fail $test
+ 	    return $res
+ 	}
+-	gdb_test_multiple "" $test {
+-	    -re "$pagination_prompt$" {
+-		pass $test
+-	    }
++	gdb_test_pagination "" $test {
++	    pass $test
++	} {
+ 	    -re "$gdb_prompt $" {
+ 		fail $test
+ 	    }
+@@ -103,20 +101,13 @@ proc test_fg_execution_pagination_return {} {
+ 
+ 	send_gdb "\n"
+ 
+-	set saw_pagination_prompt 0
+ 	set test "send \\n to GDB"
+-	gdb_test_multiple "" $test {
+-	    -re "$pagination_prompt$" {
+-		set saw_pagination_prompt 1
+-		send_gdb "\n"
+-		exp_continue
+-	    }
+-	    -notransfer -re "<return>" {
+-		# Otherwise gdb_test_multiple considers this an error.
+-		exp_continue
+-	    }
++	gdb_test_pagination "" $test {
++	    send_gdb "\n"
++	    exp_continue
++	} {
+ 	    -re "$gdb_prompt $" {
+-		gdb_assert $saw_pagination_prompt $test
++		gdb_assert { $saw_pagination_prompt == 3 } $test
+ 	    }
+ 	}
+ 
+@@ -133,7 +124,7 @@ proc test_fg_execution_pagination_return {} {
+ proc test_fg_execution_pagination_cancel { how } {
+     global file_arg
+     global saved_gdbflags GDBFLAGS
+-    global gdb_prompt pagination_prompt
++    global gdb_prompt
+ 
+     set GDBFLAGS $saved_gdbflags
+ 
+@@ -150,14 +141,8 @@ proc test_fg_execution_pagination_cancel { how } {
+ 	    fail $test
+ 	    return $res
+ 	}
+-	gdb_test_multiple "" $test {
+-	    -re "$pagination_prompt$" {
+-		pass $test
+-	    }
+-	    -notransfer -re "<return>" {
+-		# Otherwise gdb_test_multiple considers this an error.
+-		exp_continue
+-	    }
++	gdb_test_pagination "" $test {
++	    pass $test
+ 	}
+ 
+ 	set test "cancel pagination"
+diff --git a/gdb/testsuite/gdb.base/paginate-inferior-exit.exp b/gdb/testsuite/gdb.base/paginate-inferior-exit.exp
+index 0e37be9..d43a245 100644
+--- a/gdb/testsuite/gdb.base/paginate-inferior-exit.exp
++++ b/gdb/testsuite/gdb.base/paginate-inferior-exit.exp
+@@ -26,7 +26,7 @@ if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} {
+ #
+ proc test_paginate_inferior_exited {} {
+     global binfile
+-    global gdb_prompt pagination_prompt
++    global gdb_prompt
+     global inferior_exited_re
+ 
+     with_test_prefix "paginate" {
+@@ -45,23 +45,18 @@ proc test_paginate_inferior_exited {} {
+ 	# Wait for the "Starting program" line, indicating the program
+ 	# is running.
+ 	set saw_starting 0
+-	gdb_test_multiple "continue" $test {
+-	    -re "$pagination_prompt" {
+-		if {$saw_starting} {
+-		    pass $test
+-		} else {
+-		    send_gdb "\n"
+-		    exp_continue
+-		}
++	gdb_test_pagination "continue" $test {
++	    if {$saw_starting} {
++		pass $test
++	    } else {
++		send_gdb "\n"
++		exp_continue
+ 	    }
++	} {
+ 	    -re "Continuing" {
+ 		set saw_starting 1
+ 		exp_continue
+ 	    }
+-	    -notransfer -re "<return>" {
+-		# Otherwise gdb_test_multiple considers this an error.
+-		exp_continue
+-	    }
+ 	}
+ 
+ 	# We're now stopped in a pagination output while handling a
+diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
+index 7a00efb..d953a50 100644
+--- a/gdb/testsuite/lib/gdb.exp
++++ b/gdb/testsuite/lib/gdb.exp
+@@ -70,9 +70,6 @@ if ![info exists gdb_prompt] then {
+     set gdb_prompt "\[(\]gdb\[)\]"
+ }
+ 
+-# A regexp that matches the pagination prompt.
+-set pagination_prompt "---Type <return> to continue, or q <return> to quit---"
+-
+ # The variable fullname_syntax_POSIX is a regexp which matches a POSIX 
+ # absolute path ie. /foo/ 
+ set fullname_syntax_POSIX {/[^\n]*/}
+@@ -4846,5 +4843,46 @@ proc capture_command_output { command prefix } {
+     return $output_string
+ }
+ 
++# Prevent gdb_test_multiple considering an error -re "<return>" match.
++# For unknown reason -notransfer -re "<return>" { exp_continue } does not
++# prevent it.
++
++proc gdb_test_pagination { command test { code_prompt3 {} } { code_append {} } } {
++    global pagination_prompt1 pagination_prompt2 pagination_prompt3
++    global gdb_prompt
++
++    # A regexp that matches the pagination prompt.
++    set pagination_prompt1 "---Type <return"
++    set pagination_prompt2 "> to continue, or q <return"
++    set pagination_prompt3 "> to quit---"
++
++    append code_append {
++	-re "${pagination_prompt1}" {
++	    if { $saw_pagination_prompt != 0 && $saw_pagination_prompt != 3 } {
++		fail "$test (1)"
++	    }
++	    set saw_pagination_prompt 1
++	    exp_continue
++	}
++	-re "${pagination_prompt2}" {
++	    if { $saw_pagination_prompt != 1 } {
++		fail "$test (2)"
++	    }
++	    set saw_pagination_prompt 2
++	    exp_continue
++	}
++	-re "${pagination_prompt3}$" {
++	    if { $saw_pagination_prompt != 2 } {
++		fail "$test (3)"
++	    }
++	    set saw_pagination_prompt 3
++	    eval $code_prompt3
++	}
++    }
++
++    set saw_pagination_prompt 0
++    gdb_test_multiple $command $test $code_append
++}
++
+ # Always load compatibility stuff.
+ load_lib future.exp
+
+--17pEHd4RhPHOinZp--
+
diff --git a/gdb-upstream.patch b/gdb-upstream.patch
index 055067a..028fe7a 100644
--- a/gdb-upstream.patch
+++ b/gdb-upstream.patch
@@ -65,375 +65,3 @@ index 0e0202d..d849b4c 100644
  # gdbserver does not have this issue.
  if ![is_remote target] {
      setup_kfail "*-*-*" gdb/15934
-
-
-
-
-commit 768fbcfda81ff37027eb7a02c043ff669f7701fa
-Author: Pedro Alves <palves at redhat.com>
-Date:   Fri Jul 11 11:11:20 2014 +0100
-
-    GDBserver crashes when killing a multi-thread process
-    
-    Here's an example, with the new test:
-    
-     gdbserver :9999 gdb.threads/kill
-     gdb gdb.threads/kill
-     (gdb) b 52
-     Breakpoint 1 at 0x4007f4: file kill.c, line 52.
-     Continuing.
-    
-     Breakpoint 1, main () at kill.c:52
-     52        return 0; /* set break here */
-     (gdb) k
-     Kill the program being debugged? (y or n) y
-    
-     gdbserver :9999 gdb.threads/kill
-     Process gdb.base/watch_thread_num created; pid = 9719
-     Listening on port 1234
-     Remote debugging from host 127.0.0.1
-     Killing all inferiors
-     Segmentation fault (core dumped)
-    
-    Backtrace:
-    
-     (gdb) bt
-     #0  0x00000000004068a0 in find_inferior (list=0x66b060 <all_threads>, func=0x427637 <kill_one_lwp_callback>, arg=0x7fffffffd3fc) at src/gdb/gdbserver/inferiors.c:199
-     #1  0x00000000004277b6 in linux_kill (pid=15708) at src/gdb/gdbserver/linux-low.c:966
-     #2  0x000000000041354d in kill_inferior (pid=15708) at src/gdb/gdbserver/target.c:163
-     #3  0x00000000004107e9 in kill_inferior_callback (entry=0x6704f0) at src/gdb/gdbserver/server.c:2934
-     #4  0x0000000000406522 in for_each_inferior (list=0x66b050 <all_processes>, action=0x4107a6 <kill_inferior_callback>) at src/gdb/gdbserver/inferiors.c:57
-     #5  0x0000000000412377 in process_serial_event () at src/gdb/gdbserver/server.c:3767
-     #6  0x000000000041267c in handle_serial_event (err=0, client_data=0x0) at src/gdb/gdbserver/server.c:3880
-     #7  0x00000000004189ff in handle_file_event (event_file_desc=4) at src/gdb/gdbserver/event-loop.c:434
-     #8  0x00000000004181c6 in process_event () at src/gdb/gdbserver/event-loop.c:189
-     #9  0x0000000000418f45 in start_event_loop () at src/gdb/gdbserver/event-loop.c:552
-     #10 0x0000000000411272 in main (argc=3, argv=0x7fffffffd8d8) at src/gdb/gdbserver/server.c:3283
-    
-    The problem is that linux_wait_for_event deletes lwps that have exited
-    (even those not passed in as lwps of interest), while the lwp/thread
-    list is being walked on with find_inferior.  find_inferior can handle
-    the current iterated inferior being deleted, but not others.
-    
-    When killing lwps, we don't really care about any of the pending
-    status handling of linux_wait_for_event.  We can just waitpid the lwps
-    directly, which is also what GDB does (see
-    linux-nat.c:kill_wait_callback).  This way the lwps are not deleted
-    while we're walking the list.  They'll be deleted by linux_mourn
-    afterwards.
-    
-    This crash triggers several times when running the testsuite against
-    GDBserver with the native-gdbserver board (target remote), but as GDB
-    can't distinguish between GDBserver crashing and "kill" being
-    sucessful, as in both cases the connection is closed (the 'k' packet
-    doesn't require a reply), and the inferior is gone, that results in no
-    FAIL.
-    
-    The patch adds a generic test that catches the issue with
-    extended-remote mode (and works fine with native testing too).  Here's
-    how it fails with the native-extended-gdbserver board without the fix:
-    
-     (gdb) info threads
-       Id   Target Id         Frame
-       6    Thread 15367.15374 0x000000373bcbc98d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
-       5    Thread 15367.15373 0x000000373bcbc98d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
-       4    Thread 15367.15372 0x000000373bcbc98d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
-       3    Thread 15367.15371 0x000000373bcbc98d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
-       2    Thread 15367.15370 0x000000373bcbc98d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
-     * 1    Thread 15367.15367 main () at .../gdb.threads/kill.c:52
-     (gdb) kill
-     Kill the program being debugged? (y or n) y
-     Remote connection closed
-     ^^^^^^^^^^^^^^^^^^^^^^^^
-     (gdb) FAIL: gdb.threads/kill.exp: kill
-    
-    Extended remote should remain connected after the kill.
-    
-    gdb/gdbserver/
-    2014-07-11  Pedro Alves  <palves at redhat.com>
-    
-    	* linux-low.c (kill_wait_lwp): New function, based on
-    	kill_one_lwp_callback, but use my_waitpid directly.
-    	(kill_one_lwp_callback, linux_kill): Use it.
-    
-    gdb/testsuite/
-    2014-07-11  Pedro Alves  <palves at redhat.com>
-    
-    	* gdb.threads/kill.c: New file.
-    	* gdb.threads/kill.exp: New file.
-
-### a/gdb/gdbserver/ChangeLog
-### b/gdb/gdbserver/ChangeLog
-## -1,3 +1,9 @@
-+2014-07-11  Pedro Alves  <palves at redhat.com>
-+
-+	* linux-low.c (kill_wait_lwp): New function, based on
-+	kill_one_lwp_callback, but use my_waitpid directly.
-+	(kill_one_lwp_callback, linux_kill): Use it.
-+
- 2014-06-23  Pedro Alves  <palves at redhat.com>
- 
- 	* linux-x86-low.c (x86_linux_prepare_to_resume): Clear DR_CONTROL
---- a/gdb/gdbserver/linux-low.c
-+++ b/gdb/gdbserver/linux-low.c
-@@ -909,6 +909,46 @@ linux_kill_one_lwp (struct lwp_info *lwp)
- 		  errno ? strerror (errno) : "OK");
- }
- 
-+/* Kill LWP and wait for it to die.  */
-+
-+static void
-+kill_wait_lwp (struct lwp_info *lwp)
-+{
-+  struct thread_info *thr = get_lwp_thread (lwp);
-+  int pid = ptid_get_pid (ptid_of (thr));
-+  int lwpid = ptid_get_lwp (ptid_of (thr));
-+  int wstat;
-+  int res;
-+
-+  if (debug_threads)
-+    debug_printf ("kwl: killing lwp %d, for pid: %d\n", lwpid, pid);
-+
-+  do
-+    {
-+      linux_kill_one_lwp (lwp);
-+
-+      /* Make sure it died.  Notes:
-+
-+	 - The loop is most likely unnecessary.
-+
-+	 - We don't use linux_wait_for_event as that could delete lwps
-+	   while we're iterating over them.  We're not interested in
-+	   any pending status at this point, only in making sure all
-+	   wait status on the kernel side are collected until the
-+	   process is reaped.
-+
-+	 - We don't use __WALL here as the __WALL emulation relies on
-+	   SIGCHLD, and killing a stopped process doesn't generate
-+	   one, nor an exit status.
-+      */
-+      res = my_waitpid (lwpid, &wstat, 0);
-+      if (res == -1 && errno == ECHILD)
-+	res = my_waitpid (lwpid, &wstat, __WCLONE);
-+    } while (res > 0 && WIFSTOPPED (wstat));
-+
-+  gdb_assert (res > 0);
-+}
-+
- /* Callback for `find_inferior'.  Kills an lwp of a given process,
-    except the leader.  */
- 
-@@ -917,7 +957,6 @@ kill_one_lwp_callback (struct inferior_list_entry *entry, void *args)
- {
-   struct thread_info *thread = (struct thread_info *) entry;
-   struct lwp_info *lwp = get_thread_lwp (thread);
--  int wstat;
-   int pid = * (int *) args;
- 
-   if (ptid_get_pid (entry->id) != pid)
-@@ -936,14 +975,7 @@ kill_one_lwp_callback (struct inferior_list_entry *entry, void *args)
-       return 0;
-     }
- 
--  do
--    {
--      linux_kill_one_lwp (lwp);
--
--      /* Make sure it died.  The loop is most likely unnecessary.  */
--      pid = linux_wait_for_event (thread->entry.id, &wstat, __WALL);
--    } while (pid > 0 && WIFSTOPPED (wstat));
--
-+  kill_wait_lwp (lwp);
-   return 0;
- }
- 
-@@ -952,8 +984,6 @@ linux_kill (int pid)
- {
-   struct process_info *process;
-   struct lwp_info *lwp;
--  int wstat;
--  int lwpid;
- 
-   process = find_process_pid (pid);
-   if (process == NULL)
-@@ -976,21 +1006,7 @@ linux_kill (int pid)
- 		      pid);
-     }
-   else
--    {
--      struct thread_info *thr = get_lwp_thread (lwp);
--
--      if (debug_threads)
--	debug_printf ("lk_1: killing lwp %ld, for pid: %d\n",
--		      lwpid_of (thr), pid);
--
--      do
--	{
--	  linux_kill_one_lwp (lwp);
--
--	  /* Make sure it died.  The loop is most likely unnecessary.  */
--	  lwpid = linux_wait_for_event (thr->entry.id, &wstat, __WALL);
--	} while (lwpid > 0 && WIFSTOPPED (wstat));
--    }
-+    kill_wait_lwp (lwp);
- 
-   the_target->mourn (process);
- 
-### a/gdb/testsuite/ChangeLog
-### b/gdb/testsuite/ChangeLog
-## -1,3 +1,8 @@
-+2014-07-11  Pedro Alves  <palves at redhat.com>
-+
-+	* gdb.threads/kill.c: New file.
-+	* gdb.threads/kill.exp: New file.
-+
- 2014-07-09  Pedro Alves  <palves at redhat.com>
- 
- 	* gdb.base/attach-wait-input.exp: New file.
---- /dev/null
-+++ b/gdb/testsuite/gdb.threads/kill.c
-@@ -0,0 +1,64 @@
-+/* This testcase is part of GDB, the GNU debugger.
-+
-+   Copyright 2014 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/>.  */
-+
-+#ifdef USE_THREADS
-+
-+#include <unistd.h>
-+#include <pthread.h>
-+
-+#define NUM 5
-+
-+pthread_barrier_t barrier;
-+
-+void *
-+thread_function (void *arg)
-+{
-+  volatile unsigned int counter = 1;
-+
-+  pthread_barrier_wait (&barrier);
-+
-+  while (counter > 0)
-+    {
-+      counter++;
-+      usleep (1);
-+    }
-+
-+  pthread_exit (NULL);
-+}
-+
-+#endif /* USE_THREADS */
-+
-+void
-+setup (void)
-+{
-+#ifdef USE_THREADS
-+  pthread_t threads[NUM];
-+  int i;
-+
-+  pthread_barrier_init (&barrier, NULL, NUM + 1);
-+  for (i = 0; i < NUM; i++)
-+    pthread_create (&threads[i], NULL, thread_function, NULL);
-+  pthread_barrier_wait (&barrier);
-+#endif /* USE_THREADS */
-+}
-+
-+int
-+main (void)
-+{
-+  setup ();
-+  return 0; /* set break here */
-+}
---- /dev/null
-+++ b/gdb/testsuite/gdb.threads/kill.exp
-@@ -0,0 +1,77 @@
-+# This testcase is part of GDB, the GNU debugger.
-+
-+# Copyright 2014 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/>.  */
-+
-+standard_testfile
-+
-+# Run the test proper.  THREADED indicates whether to build a threaded
-+# program and spawn several threads before trying to kill the program.
-+
-+proc test {threaded} {
-+    global testfile srcfile
-+
-+    with_test_prefix [expr ($threaded)?"threaded":"non-threaded"] {
-+
-+	set options {debug}
-+	if {$threaded} {
-+	    lappend options "pthreads"
-+	    lappend options "additional_flags=-DUSE_THREADS"
-+	    set prog ${testfile}_threads
-+	} else {
-+	    set prog ${testfile}_nothreads
-+	}
-+
-+	if {[prepare_for_testing "failed to prepare" $prog $srcfile $options] == -1} {
-+	    return -1
-+	}
-+
-+	if { ![runto main] } then {
-+	    fail "run to main"
-+	    return
-+	}
-+
-+	set linenum [gdb_get_line_number "set break here"]
-+	gdb_breakpoint "$srcfile:$linenum"
-+	gdb_continue_to_breakpoint "break here" ".*break here.*"
-+
-+	if {$threaded} {
-+	    gdb_test "info threads" "6.*5.*4.*3.*2.*1.*" "all threads started"
-+	}
-+
-+	# This kills and ensures no output other than the prompt comes out,
-+	# like:
-+	#
-+	#  (gdb) kill
-+	#  Kill the program being debugged? (y or n) y
-+	#  (gdb)
-+	#
-+	# If we instead saw more output, like e.g., with an extended-remote
-+	# connection:
-+	#
-+	#  (gdb) kill
-+	#  Kill the program being debugged? (y or n) y
-+	#  Remote connection closed
-+	#  (gdb)
-+	#
-+	# the above would mean that the remote end crashed.
-+
-+	gdb_test "kill" "^y" "kill program" "Kill the program being debugged\\? \\(y or n\\) $" "y"
-+    }
-+}
-+
-+foreach threaded {true false} {
-+    test $threaded
-+}
diff --git a/gdb-vla-intel.patch b/gdb-vla-intel.patch
index 0a646ab..d4f9eed 100644
--- a/gdb-vla-intel.patch
+++ b/gdb-vla-intel.patch
@@ -3,19 +3,18 @@ https://sourceware.org/ml/gdb-patches/2014-06/msg00108.html
 https://github.com/intel-gdb/vla/tree/vla-fortran
 
 GIT snapshot:
-commit c622a047d23bcbc4dc68398fc70b531cebd8f5ee
+commit 511bff520372ffc10fa2ff569c176bdf1e6e475d
 
 
 diff --git a/gdb/NEWS b/gdb/NEWS
-index d9a19ae..1f22fea 100644
+index d9a19ae..e6885d2 100644
 ### a/gdb/NEWS
 ### b/gdb/NEWS
-@@ -3,6 +3,10 @@
+@@ -3,6 +3,9 @@
  
  *** Changes since GDB 7.8
  
-+* Fortran dynamic array support: GDB has now support for
-+  dynamic arrays in Fortran. It allows the user to evaluate
++* Fortran dynamic array support: It allows the user to evaluate
 +  dynamic arrays like an ordinary static array.
 +
  *** Changes in GDB 7.8
@@ -78,7 +77,7 @@ index 39dadf3..8cebbe8 100644
  
  /* The location of a value.  */
 diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
-index fcab9b9..4aac278 100644
+index fcab9b9..a624dac 100644
 --- a/gdb/dwarf2loc.c
 +++ b/gdb/dwarf2loc.c
 @@ -306,6 +306,7 @@ struct dwarf_expr_baton
@@ -138,7 +137,19 @@ index fcab9b9..4aac278 100644
  
    ctx = new_dwarf_expr_context ();
    old_chain = make_cleanup_free_dwarf_expr_context (ctx);
-@@ -2436,6 +2456,7 @@ dwarf2_evaluate_loc_desc (struct type *type, struct frame_info *frame,
+@@ -2326,6 +2346,11 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame,
+ 	    int in_stack_memory = dwarf_expr_fetch_in_stack_memory (ctx, 0);
+ 
+ 	    do_cleanups (value_chain);
++
++	    /* Select right frame to correctly evaluate VLA's during a backtrace.  */
++	    if (is_dynamic_type (type))
++	      select_frame (frame);
++
+ 	    retval = value_at_lazy (type, address + byte_offset);
+ 	    if (in_stack_memory)
+ 	      set_value_stack (retval, 1);
+@@ -2436,6 +2461,7 @@ dwarf2_evaluate_loc_desc (struct type *type, struct frame_info *frame,
  
  static int
  dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
@@ -146,7 +157,7 @@ index fcab9b9..4aac278 100644
  			   CORE_ADDR *valp)
  {
    struct dwarf_expr_context *ctx;
-@@ -2451,6 +2472,7 @@ dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
+@@ -2451,6 +2477,7 @@ dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
  
    baton.frame = get_selected_frame (NULL);
    baton.per_cu = dlbaton->per_cu;
@@ -154,7 +165,7 @@ index fcab9b9..4aac278 100644
  
    objfile = dwarf2_per_cu_objfile (dlbaton->per_cu);
  
-@@ -2491,7 +2513,8 @@ dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
+@@ -2491,7 +2518,8 @@ dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
  /* See dwarf2loc.h.  */
  
  int
@@ -164,7 +175,7 @@ index fcab9b9..4aac278 100644
  {
    if (prop == NULL)
      return 0;
-@@ -2502,7 +2525,7 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, CORE_ADDR *value)
+@@ -2502,7 +2530,7 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, CORE_ADDR *value)
        {
  	const struct dwarf2_property_baton *baton = prop->data.baton;
  
@@ -173,31 +184,7 @@ index fcab9b9..4aac278 100644
  	  {
  	    if (baton->referenced_type)
  	      {
-@@ -2510,6 +2533,11 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, CORE_ADDR *value)
- 
- 		*value = value_as_address (val);
- 	      }
-+	    if (baton->post_values.data && baton->post_values.size > 0)
-+	      {
-+	        CORE_ADDR new_addr = *value;
-+	        dwarf2_locexpr_baton_eval (&baton->post_values, new_addr, value);
-+	      }
- 	    return 1;
- 	  }
-       }
-@@ -2532,6 +2560,11 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, CORE_ADDR *value)
- 	    if (!value_optimized_out (val))
- 	      {
- 		*value = value_as_address (val);
-+		if (baton->post_values.data && baton->post_values.size > 0)
-+		  {
-+		    CORE_ADDR new_addr = *value;
-+		    dwarf2_locexpr_baton_eval (&baton->post_values, new_addr, value);
-+		  }
- 		return 1;
- 	      }
- 	  }
-@@ -2546,6 +2579,20 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, CORE_ADDR *value)
+@@ -2546,6 +2574,20 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, CORE_ADDR *value)
    return 0;
  }
  
@@ -218,7 +205,7 @@ index fcab9b9..4aac278 100644
  
  /* Helper functions and baton for dwarf2_loc_desc_needs_frame.  */
  
-@@ -2653,6 +2700,15 @@ needs_get_addr_index (void *baton, unsigned int index)
+@@ -2653,6 +2695,15 @@ needs_get_addr_index (void *baton, unsigned int index)
    return 1;
  }
  
@@ -234,7 +221,7 @@ index fcab9b9..4aac278 100644
  /* Virtual method table for dwarf2_loc_desc_needs_frame below.  */
  
  static const struct dwarf_expr_context_funcs needs_frame_ctx_funcs =
-@@ -2667,7 +2723,8 @@ static const struct dwarf_expr_context_funcs needs_frame_ctx_funcs =
+@@ -2667,7 +2718,8 @@ static const struct dwarf_expr_context_funcs needs_frame_ctx_funcs =
    needs_frame_dwarf_call,
    NULL,				/* get_base_type */
    needs_dwarf_reg_entry_value,
@@ -244,7 +231,7 @@ index fcab9b9..4aac278 100644
  };
  
  /* Return non-zero iff the location expression at DATA (length SIZE)
-@@ -3316,6 +3373,10 @@ dwarf2_compile_expr_to_ax (struct agent_expr *expr, struct axs_value *loc,
+@@ -3316,6 +3368,10 @@ dwarf2_compile_expr_to_ax (struct agent_expr *expr, struct axs_value *loc,
  	  unimplemented (op);
  	  break;
  
@@ -256,7 +243,7 @@ index fcab9b9..4aac278 100644
  	  offset = extract_signed_integer (op_ptr, 2, byte_order);
  	  op_ptr += 2;
 diff --git a/gdb/dwarf2loc.h b/gdb/dwarf2loc.h
-index 8ad5fa9..cf648eb 100644
+index 8ad5fa9..fb65c5c 100644
 --- a/gdb/dwarf2loc.h
 +++ b/gdb/dwarf2loc.h
 @@ -96,11 +96,18 @@ struct value *dwarf2_evaluate_loc_desc (struct type *type,
@@ -278,21 +265,11 @@ index 8ad5fa9..cf648eb 100644
  /* The symbol location baton types used by the DWARF-2 reader (i.e.
     SYMBOL_LOCATION_BATON for a LOC_COMPUTED symbol).  "struct
     dwarf2_locexpr_baton" is for a symbol with a single location
-@@ -161,6 +168,9 @@ struct dwarf2_property_baton
-     /* Location list to be evaluated in the context of REFERENCED_TYPE.  */
-     struct dwarf2_loclist_baton loclist;
-   };
-+
-+  /* Attributes, which will be pushed after evaluating locexpr or loclist.  */
-+  struct dwarf2_locexpr_baton post_values;
- };
- 
- extern const struct symbol_computed_ops dwarf2_locexpr_funcs;
 diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
-index 276d2f1..f5b35d7 100644
+index 276d2f1..fbf13ce 100644
 --- a/gdb/dwarf2read.c
 +++ b/gdb/dwarf2read.c
-@@ -1847,6 +1847,15 @@ static void free_dwo_file_cleanup (void *);
+@@ -1847,6 +1847,12 @@ static void free_dwo_file_cleanup (void *);
  static void process_cu_includes (void);
  
  static void check_producer (struct dwarf2_cu *cu);
@@ -302,13 +279,10 @@ index 276d2f1..f5b35d7 100644
 +		      struct dwarf2_cu *cu, struct dynamic_prop *prop,
 +		      const gdb_byte *additional_data, int additional_data_size);
 +
-+static void add_post_values_to_baton (struct dwarf2_property_baton *baton,
-+        const gdb_byte *data, int size, struct dwarf2_cu *cu);
-+
  
  /* Various complaints about symbol reading that don't abort the process.  */
  
-@@ -14201,29 +14210,90 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -14201,29 +14207,92 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu)
    struct gdbarch *gdbarch = get_objfile_arch (objfile);
    struct type *type, *range_type, *index_type, *char_type;
    struct attribute *attr;
@@ -348,7 +322,6 @@ index 276d2f1..f5b35d7 100644
 +                 data attribute, to reflect DWARF specialities to get address
 +                 sizes.  */
 +              const gdb_byte append_ops[] = {
-+                DW_OP_push_object_address,
 +                /* DW_OP_deref_size: size of an address on the target machine
 +                   (bytes), where the size will be specified by the next
 +                   operand.  */
@@ -368,7 +341,10 @@ index 276d2f1..f5b35d7 100644
 +             is the address size of the target machine.  */
 +          else
 +            {
-+              if (!attr_to_dynamic_prop (attr, die, cu, &high, NULL, 0))
++              const gdb_byte append_ops[] = { DW_OP_deref };
++
++              if (!attr_to_dynamic_prop (attr, die, cu, &high, append_ops,
++                      ARRAY_SIZE (append_ops)))
 +                complaint (&symfile_complaints,
 +                        _("Could not parse DW_AT_string_length"));
 +            }
@@ -406,31 +382,10 @@ index 276d2f1..f5b35d7 100644
    char_type = language_string_char_type (cu->language_defn, gdbarch);
    type = create_string_type (NULL, char_type, range_type);
  
-@@ -14540,13 +14610,36 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -14540,13 +14609,15 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu)
    return set_die_type (die, type, cu);
  }
  
-+/* Add post processing op-codes to a dwarf2_property_baton.  */
-+
-+static void add_post_values_to_baton (struct dwarf2_property_baton *baton,
-+        const gdb_byte *data, int size, struct dwarf2_cu *cu)
-+{
-+  if (data != NULL && size > 0)
-+    {
-+      struct obstack *obstack = &cu->objfile->objfile_obstack;
-+      gdb_byte *post_data;
-+
-+      post_data = obstack_alloc (obstack, size);
-+      memcpy(post_data, data, size);
-+      baton->post_values.data = post_data;
-+      baton->post_values.size = size;
-+      baton->post_values.per_cu = cu->per_cu;
-+    } else {
-+      baton->post_values.data = NULL;
-+      baton->post_values.size = 0;
-+      baton->post_values.per_cu = NULL;
-+    }
-+}
 +
  /* Parse dwarf attribute if it's a block, reference or constant and put the
     resulting value of the attribute into struct bound_prop.
@@ -444,37 +399,66 @@ index 276d2f1..f5b35d7 100644
  {
    struct dwarf2_property_baton *baton;
    struct obstack *obstack = &cu->objfile->objfile_obstack;
-@@ -14559,8 +14652,10 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die,
+@@ -14559,8 +14630,25 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die,
        baton = obstack_alloc (obstack, sizeof (*baton));
        baton->referenced_type = NULL;
        baton->locexpr.per_cu = cu->per_cu;
 -      baton->locexpr.size = DW_BLOCK (attr)->size;
-       baton->locexpr.data = DW_BLOCK (attr)->data;
-+      baton->locexpr.size = DW_BLOCK (attr)->size;
-+      add_post_values_to_baton (baton, additional_data,
-+                                additional_data_size, cu);
+-      baton->locexpr.data = DW_BLOCK (attr)->data;
++
++      if (additional_data != NULL && additional_data_size > 0)
++        {
++          gdb_byte *data;
++
++          data = obstack_alloc (&cu->objfile->objfile_obstack,
++                  DW_BLOCK (attr)->size + additional_data_size);
++          memcpy (data, DW_BLOCK (attr)->data, DW_BLOCK (attr)->size);
++          memcpy (data + DW_BLOCK (attr)->size,
++                  additional_data, additional_data_size);
++
++          baton->locexpr.data = data;
++          baton->locexpr.size = DW_BLOCK (attr)->size + additional_data_size;
++        }
++      else
++        {
++          baton->locexpr.data = DW_BLOCK (attr)->data;
++          baton->locexpr.size = DW_BLOCK (attr)->size;
++        }
        prop->data.baton = baton;
        prop->kind = PROP_LOCEXPR;
        gdb_assert (prop->data.baton != NULL);
-@@ -14581,6 +14676,8 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die,
+@@ -14590,8 +14678,28 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die,
  	  baton = obstack_alloc (obstack, sizeof (*baton));
  	  baton->referenced_type = die_type (target_die, target_cu);
- 	  fill_in_loclist_baton (cu, &baton->loclist, target_attr);
-+	  add_post_values_to_baton (baton, additional_data,
-+	                            additional_data_size, cu);
- 	  prop->data.baton = baton;
- 	  prop->kind = PROP_LOCLIST;
- 	  gdb_assert (prop->data.baton != NULL);
-@@ -14592,6 +14689,8 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die,
  	  baton->locexpr.per_cu = cu->per_cu;
- 	  baton->locexpr.size = DW_BLOCK (target_attr)->size;
- 	  baton->locexpr.data = DW_BLOCK (target_attr)->data;
-+	  add_post_values_to_baton (baton, additional_data,
-+	                            additional_data_size, cu);
+-	  baton->locexpr.size = DW_BLOCK (target_attr)->size;
+-	  baton->locexpr.data = DW_BLOCK (target_attr)->data;
++
++	  if (additional_data != NULL && additional_data_size > 0)
++	    {
++	      gdb_byte *data;
++
++	      data = obstack_alloc (&cu->objfile->objfile_obstack,
++	              DW_BLOCK (target_attr)->size + additional_data_size);
++	      memcpy (data, DW_BLOCK (target_attr)->data,
++	              DW_BLOCK (target_attr)->size);
++	      memcpy (data + DW_BLOCK (target_attr)->size,
++	              additional_data, additional_data_size);
++
++	      baton->locexpr.data = data;
++	      baton->locexpr.size = (DW_BLOCK (target_attr)->size
++	                             + additional_data_size);
++	    }
++	  else
++	    {
++	      baton->locexpr.data = DW_BLOCK (target_attr)->data;
++	      baton->locexpr.size = DW_BLOCK (target_attr)->size;
++	    }
++
  	  prop->data.baton = baton;
  	  prop->kind = PROP_LOCEXPR;
  	  gdb_assert (prop->data.baton != NULL);
-@@ -14626,7 +14725,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -14626,7 +14734,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
    struct type *base_type, *orig_base_type;
    struct type *range_type;
    struct attribute *attr;
@@ -483,7 +467,7 @@ index 276d2f1..f5b35d7 100644
    int low_default_is_valid;
    int high_bound_is_count = 0;
    const char *name;
-@@ -14646,7 +14745,9 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -14646,7 +14754,9 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
  
    low.kind = PROP_CONST;
    high.kind = PROP_CONST;
@@ -493,7 +477,7 @@ index 276d2f1..f5b35d7 100644
  
    /* Set LOW_DEFAULT_IS_VALID if current language and DWARF version allow
       omitting DW_AT_lower_bound.  */
-@@ -14679,19 +14780,26 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -14679,19 +14789,26 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
        break;
      }
  
@@ -523,7 +507,7 @@ index 276d2f1..f5b35d7 100644
  	{
  	  /* If bounds are constant do the final calculation here.  */
  	  if (low.kind == PROP_CONST && high.kind == PROP_CONST)
-@@ -14755,7 +14863,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
+@@ -14755,7 +14872,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
        && !TYPE_UNSIGNED (base_type) && (high.data.const_val & negative_mask))
      high.data.const_val |= negative_mask;
  
@@ -532,7 +516,7 @@ index 276d2f1..f5b35d7 100644
  
    if (high_bound_is_count)
      TYPE_RANGE_DATA (range_type)->flag_upper_bound_is_count = 1;
-@@ -21673,6 +21781,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+@@ -21673,6 +21790,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
  {
    struct dwarf2_per_cu_offset_and_type **slot, ofs;
    struct objfile *objfile = cu->objfile;
@@ -541,7 +525,7 @@ index 276d2f1..f5b35d7 100644
  
    /* For Ada types, make sure that the gnat-specific data is always
       initialized (if not already set).  There are a few types where
-@@ -21687,6 +21797,43 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
+@@ -21687,6 +21806,43 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
        && !HAVE_GNAT_AUX_INFO (type))
      INIT_GNAT_SPECIFIC (type);
  
@@ -864,7 +848,7 @@ index 408c8cc..38f32e0 100644
              fputs_filtered (", ", stream);
          }
 diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
-index d0c002f..3f52d61 100644
+index e99a2f3..53cae2c 100644
 --- a/gdb/gdbtypes.c
 +++ b/gdb/gdbtypes.c
 @@ -805,7 +805,8 @@ allocate_stub_method (struct type *type)
@@ -934,9 +918,9 @@ index d0c002f..3f52d61 100644
        else if (bit_stride > 0)
  	TYPE_LENGTH (result_type) =
  	  (bit_stride * (high_bound - low_bound + 1) + 7) / 8;
-@@ -1616,11 +1628,30 @@ stub_noname_complaint (void)
- int
- is_dynamic_type (struct type *type)
+@@ -1616,12 +1628,31 @@ stub_noname_complaint (void)
+ static int
+ is_dynamic_type_internal (struct type *type, int top_level)
  {
 +  int index;
 +
@@ -945,7 +929,8 @@ index d0c002f..3f52d61 100644
 +
    type = check_typedef (type);
  
-   if (TYPE_CODE (type) == TYPE_CODE_REF)
+   /* We only want to recognize references at the outermost level.  */
+   if (top_level && TYPE_CODE (type) == TYPE_CODE_REF)
      type = check_typedef (TYPE_TARGET_TYPE (type));
  
 +  if (TYPE_ASSOCIATED_PROP (type))
@@ -965,7 +950,7 @@ index d0c002f..3f52d61 100644
    switch (TYPE_CODE (type))
      {
      case TYPE_CODE_RANGE:
-@@ -1630,11 +1661,19 @@ is_dynamic_type (struct type *type)
+@@ -1631,11 +1662,19 @@ is_dynamic_type_internal (struct type *type, int top_level)
        {
  	gdb_assert (TYPE_NFIELDS (type) == 1);
  
@@ -975,21 +960,21 @@ index d0c002f..3f52d61 100644
 +     - the bounds are dynamic,
 +	   - the elements it contains have a dynamic contents
 +     - a data_locaton attribute was found.  */
- 	if (is_dynamic_type (TYPE_INDEX_TYPE (type)))
+ 	if (is_dynamic_type_internal (TYPE_INDEX_TYPE (type), 0))
  	  return 1;
--	return is_dynamic_type (TYPE_TARGET_TYPE (type));
+-	return is_dynamic_type_internal (TYPE_TARGET_TYPE (type), 0);
 +	else if (TYPE_DATA_LOCATION (type) != NULL
 +	         && (TYPE_DATA_LOCATION_KIND (type) == PROP_LOCEXPR
 +	             || TYPE_DATA_LOCATION_KIND (type) == PROP_LOCLIST))
 +    return 1;
 +  else
-+    return is_dynamic_type (TYPE_TARGET_TYPE (type));
++    return is_dynamic_type_internal (TYPE_TARGET_TYPE (type), 0);
 +	break;
        }
  
      case TYPE_CODE_STRUCT:
-@@ -1647,28 +1686,40 @@ is_dynamic_type (struct type *type)
- 	      && is_dynamic_type (TYPE_FIELD_TYPE (type, i)))
+@@ -1648,6 +1687,17 @@ is_dynamic_type_internal (struct type *type, int top_level)
+ 	      && is_dynamic_type_internal (TYPE_FIELD_TYPE (type, i), 0))
  	    return 1;
        }
 +    case TYPE_CODE_PTR:
@@ -1006,8 +991,9 @@ index d0c002f..3f52d61 100644
        break;
      }
  
-   return 0;
- }
+@@ -1666,22 +1716,23 @@ static struct type *resolve_dynamic_type_internal (struct type *type,
+ 						   CORE_ADDR addr,
+ 						   int top_level);
  
 -/* Given a dynamic range type (dyn_range_type), return a static version
 -   of that type.  */
@@ -1034,7 +1020,7 @@ index d0c002f..3f52d61 100644
      {
        low_bound.kind = PROP_CONST;
        low_bound.data.const_val = value;
-@@ -1680,7 +1731,7 @@ resolve_dynamic_range (struct type *dyn_range_type)
+@@ -1693,7 +1744,7 @@ resolve_dynamic_range (struct type *dyn_range_type)
      }
  
    prop = &TYPE_RANGE_DATA (dyn_range_type)->high;
@@ -1043,7 +1029,7 @@ index d0c002f..3f52d61 100644
      {
        high_bound.kind = PROP_CONST;
        high_bound.data.const_val = value;
-@@ -1694,10 +1745,17 @@ resolve_dynamic_range (struct type *dyn_range_type)
+@@ -1707,10 +1758,17 @@ resolve_dynamic_range (struct type *dyn_range_type)
        high_bound.kind = PROP_UNDEFINED;
        high_bound.data.const_val = 0;
      }
@@ -1064,7 +1050,7 @@ index d0c002f..3f52d61 100644
    TYPE_RANGE_DATA (static_range_type)->flag_bound_evaluated = 1;
    return static_range_type;
  }
-@@ -1707,29 +1765,52 @@ resolve_dynamic_range (struct type *dyn_range_type)
+@@ -1720,29 +1778,52 @@ resolve_dynamic_range (struct type *dyn_range_type)
     of the associated array.  */
  
  static struct type *
@@ -1125,24 +1111,16 @@ index d0c002f..3f52d61 100644
  }
  
  /* Resolve dynamic bounds of members of the union TYPE to static
-@@ -1823,6 +1904,7 @@ resolve_dynamic_struct (struct type *type, CORE_ADDR addr)
-   return resolved_type;
- }
- 
-+
- /* See gdbtypes.h  */
- 
- struct type *
-@@ -1830,6 +1912,8 @@ resolve_dynamic_type (struct type *type, CORE_ADDR addr)
+@@ -1846,6 +1927,8 @@ resolve_dynamic_type_internal (struct type *type, CORE_ADDR addr,
  {
    struct type *real_type = check_typedef (type);
    struct type *resolved_type = type;
 +  const struct dynamic_prop *prop;
 +  CORE_ADDR value;
  
-   if (!is_dynamic_type (real_type))
+   if (!is_dynamic_type_internal (real_type, top_level))
      return type;
-@@ -1853,11 +1937,12 @@ resolve_dynamic_type (struct type *type, CORE_ADDR addr)
+@@ -1871,11 +1954,12 @@ resolve_dynamic_type_internal (struct type *type, CORE_ADDR addr,
  	}
  
        case TYPE_CODE_ARRAY:
@@ -1157,7 +1135,7 @@ index d0c002f..3f52d61 100644
  	break;
  
      case TYPE_CODE_UNION:
-@@ -1869,6 +1954,25 @@ resolve_dynamic_type (struct type *type, CORE_ADDR addr)
+@@ -1887,6 +1971,25 @@ resolve_dynamic_type_internal (struct type *type, CORE_ADDR addr,
        break;
      }
  
@@ -1183,7 +1161,7 @@ index d0c002f..3f52d61 100644
    return resolved_type;
  }
  
-@@ -4078,6 +4182,27 @@ copy_type_recursive (struct objfile *objfile,
+@@ -4104,6 +4207,27 @@ copy_type_recursive (struct objfile *objfile,
        *TYPE_RANGE_DATA (new_type) = *TYPE_RANGE_DATA (type);
      }
  
@@ -1211,7 +1189,7 @@ index d0c002f..3f52d61 100644
    /* Copy pointers to other types.  */
    if (TYPE_TARGET_TYPE (type))
      TYPE_TARGET_TYPE (new_type) = 
-@@ -4124,6 +4249,44 @@ copy_type (const struct type *type)
+@@ -4150,6 +4274,44 @@ copy_type (const struct type *type)
    memcpy (TYPE_MAIN_TYPE (new_type), TYPE_MAIN_TYPE (type),
  	  sizeof (struct main_type));
  
@@ -1257,10 +1235,10 @@ index d0c002f..3f52d61 100644
  }
  
 diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
-index bb6352d..5818f79 100644
+index 5008ef4..436edf8 100644
 --- a/gdb/gdbtypes.h
 +++ b/gdb/gdbtypes.h
-@@ -670,6 +670,10 @@ struct main_type
+@@ -669,6 +669,10 @@ struct main_type
  
        struct dynamic_prop high;
  
@@ -1271,7 +1249,7 @@ index bb6352d..5818f79 100644
        /* True if HIGH range bound contains the number of elements in the
  	 subrange. This affects how the final hight bound is computed.  */
  
-@@ -725,6 +729,23 @@ struct main_type
+@@ -724,6 +728,23 @@ struct main_type
  
      struct func_type *func_stuff;
    } type_specific;
@@ -1295,7 +1273,7 @@ index bb6352d..5818f79 100644
  };
  
  /* * A ``struct type'' describes a particular instance of a type, with
-@@ -1203,6 +1224,39 @@ extern void allocate_gnat_aux_type (struct type *);
+@@ -1202,6 +1223,39 @@ extern void allocate_gnat_aux_type (struct type *);
    TYPE_RANGE_DATA(range_type)->high.kind
  #define TYPE_LOW_BOUND_KIND(range_type) \
    TYPE_RANGE_DATA(range_type)->low.kind
@@ -1335,7 +1313,7 @@ index bb6352d..5818f79 100644
  
  /* Moto-specific stuff for FORTRAN arrays.  */
  
-@@ -1210,6 +1264,9 @@ extern void allocate_gnat_aux_type (struct type *);
+@@ -1209,6 +1263,9 @@ extern void allocate_gnat_aux_type (struct type *);
     TYPE_HIGH_BOUND_UNDEFINED(TYPE_INDEX_TYPE(arraytype))
  #define TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED(arraytype) \
     TYPE_LOW_BOUND_UNDEFINED(TYPE_INDEX_TYPE(arraytype))
@@ -1345,7 +1323,7 @@ index bb6352d..5818f79 100644
  
  #define TYPE_ARRAY_UPPER_BOUND_VALUE(arraytype) \
     (TYPE_HIGH_BOUND(TYPE_INDEX_TYPE((arraytype))))
-@@ -1678,6 +1735,7 @@ extern struct type *create_array_type_with_stride
+@@ -1677,6 +1734,7 @@ extern struct type *create_array_type_with_stride
  
  extern struct type *create_range_type (struct type *, struct type *,
  				       const struct dynamic_prop *,
@@ -2030,10 +2008,10 @@ index 0000000..6053c17
 +gdb_test "print sizeof(pvla)" " = 4000" "print sizeof associated pvla"
 diff --git a/gdb/testsuite/gdb.fortran/vla-stride.exp b/gdb/testsuite/gdb.fortran/vla-stride.exp
 new file mode 100644
-index 0000000..e791115
+index 0000000..35f585d
 --- /dev/null
 +++ b/gdb/testsuite/gdb.fortran/vla-stride.exp
-@@ -0,0 +1,51 @@
+@@ -0,0 +1,44 @@
 +# Copyright 2014 Free Software Foundation, Inc.
 +
 +# This program is free software; you can redistribute it and/or modify
@@ -2061,13 +2039,6 @@ index 0000000..e791115
 +    continue
 +}
 +
-+gdb_breakpoint [gdb_get_line_number "reverse-elements"]
-+gdb_continue_to_breakpoint "reverse-elements"
-+gdb_test "print pvla" " = \\\(10, 9, 8, 7, 6, 5, 4, 3, 2, 1\\\)" \
-+  "print reverse-elements"
-+gdb_test "print pvla(1)" " = 10" "print first reverse-element"
-+gdb_test "print pvla(10)" " = 1" "print last reverse-element"
-+
 +gdb_breakpoint [gdb_get_line_number "re-reverse-elements"]
 +gdb_continue_to_breakpoint "re-reverse-elements"
 +gdb_test "print pvla" " = \\\(1, 2, 3, 4, 5, 6, 7, 8, 9, 10\\\)" \
@@ -2087,7 +2058,7 @@ index 0000000..e791115
 +gdb_test "print pvla(1)" " = 5" "print one single-element"
 diff --git a/gdb/testsuite/gdb.fortran/vla-stride.f90 b/gdb/testsuite/gdb.fortran/vla-stride.f90
 new file mode 100644
-index 0000000..1f8cc55
+index 0000000..6aa4f2b
 --- /dev/null
 +++ b/gdb/testsuite/gdb.fortran/vla-stride.f90
 @@ -0,0 +1,30 @@
@@ -2115,7 +2086,7 @@ index 0000000..1f8cc55
 +  vla = (/ (I, I = 1,10) /)
 +
 +  pvla => vla(10:1:-1)
-+  pvla => pvla(10:1:-1) ! reverse-elements
++  pvla => pvla(10:1:-1)
 +  pvla => vla(1:10:2)   ! re-reverse-elements
 +  pvla => vla(5:4:-2)   ! odd-elements
 +
@@ -3157,7 +3128,7 @@ index 6698247..7a415cf 100644
 +
  #endif
 diff --git a/gdb/value.c b/gdb/value.c
-index 557056f..4e91a43 100644
+index 29abe5f..5efea89 100644
 --- a/gdb/value.c
 +++ b/gdb/value.c
 @@ -43,6 +43,7 @@
@@ -3168,7 +3139,7 @@ index 557056f..4e91a43 100644
  
  /* Prototypes for exported functions.  */
  
-@@ -1646,6 +1647,25 @@ set_value_component_location (struct value *component,
+@@ -1627,6 +1628,25 @@ set_value_component_location (struct value *component,
        if (funcs->copy_closure)
          component->location.computed.closure = funcs->copy_closure (whole);
      }
@@ -3194,7 +3165,7 @@ index 557056f..4e91a43 100644
  }
  
  
-@@ -2950,13 +2970,22 @@ value_primitive_field (struct value *arg1, int offset,
+@@ -2931,13 +2951,22 @@ value_primitive_field (struct value *arg1, int offset,
  	v = allocate_value_lazy (type);
        else
  	{
@@ -3223,7 +3194,7 @@ index 557056f..4e91a43 100644
      }
    set_value_component_location (v, arg1);
    VALUE_REGNUM (v) = VALUE_REGNUM (arg1);
-@@ -3539,7 +3568,8 @@ readjust_indirect_value_type (struct value *value, struct type *enc_type,
+@@ -3520,7 +3549,8 @@ readjust_indirect_value_type (struct value *value, struct type *enc_type,
  			      struct value *original_value)
  {
    /* Re-adjust type.  */
@@ -3233,7 +3204,7 @@ index 557056f..4e91a43 100644
  
    /* Add embedding info.  */
    set_value_enclosing_type (value, enc_type);
-@@ -3556,6 +3586,12 @@ coerce_ref (struct value *arg)
+@@ -3537,6 +3567,12 @@ coerce_ref (struct value *arg)
    struct value *retval;
    struct type *enc_type;
  
@@ -3246,7 +3217,7 @@ index 557056f..4e91a43 100644
    retval = coerce_ref_if_computed (arg);
    if (retval)
      return retval;
-@@ -3699,8 +3735,14 @@ value_fetch_lazy (struct value *val)
+@@ -3680,8 +3716,14 @@ value_fetch_lazy (struct value *val)
      }
    else if (VALUE_LVAL (val) == lval_memory)
      {
diff --git a/gdb.spec b/gdb.spec
index 78e6b92..75b9417 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -18,14 +18,14 @@ Summary: A GNU source-level debugger for C, C++, Fortran, Go and other languages
 Name: %{?scl_prefix}gdb
 
 # Freeze it when GDB gets branched
-%global snapsrc    20140711
+%global snapsrc    20140721
 # See timestamp of source gnulib installed into gdb/gnulib/ .
 %global snapgnulib 20121213
-Version: 7.7.90.%{snapsrc}
+Version: 7.7.91.%{snapsrc}
 
 # 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.
-Release: 11%{?dist}
+Release: 12%{?dist}
 
 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain and GFDL
 Group: Development/Debuggers
@@ -516,12 +516,17 @@ Patch914: gdb-readline-6.3.5.patch
 Patch918: gdb-btrobust.patch
 
 # Fix crash on optimized-out entry data values (BZ 1111910).
-Patch919: gdb-entrydataoptimizedout.patch
+Patch922: gdb-entryval-crash-1of3.patch
+Patch923: gdb-entryval-crash-2of3.patch
+Patch919: gdb-entryval-crash-3of3.patch
 
 # Python completion w/overriden completer (Sergio Durigan Junior, BZ 1075199).
 Patch920: gdb-python-completer-1of2.patch
 Patch921: gdb-python-completer-2of2.patch
 
+# [testsuite] Fix paginate-*.exp race for "read1".
+Patch924: gdb-testsuite-pagination-read1.patch
+
 %if 0%{!?rhel:1} || 0%{?rhel} > 6
 # RL_STATE_FEDORA_GDB would not be found for:
 # Patch642: gdb-readline62-ask-more-rh.patch
@@ -798,9 +803,12 @@ find -name "*.info*"|xargs rm -f
 %patch887 -p1
 %patch914 -p1
 %patch918 -p1
-%patch919 -p1
 %patch920 -p1
 %patch921 -p1
+%patch922 -p1
+%patch923 -p1
+%patch919 -p1
+%patch924 -p1
 
 %patch848 -p1
 %if 0%{!?el6:1}
@@ -1291,6 +1299,12 @@ then
 fi
 
 %changelog
+* Tue Jul 22 2014 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.7.91.20140721-12.fc21
+- Rebase to FSF GDB 7.7.91.20140721 (pre-7.8 snapshot).
+- Rebase the Intel VLA patchset.
+- New fix of the optimized-out entry data values crash (BZ 1111910).
+- [testsuite] Fix paginate-*.exp race for "read1".
+
 * Fri Jul 11 2014 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.7.90.20140711-11.fc21
 - Fix regression#2 of the optimized-out entry data values fix (of BZ 1111910).
 - Rebase to FSF GDB 7.7.90.20140711 (pre-7.8 snapshot).
diff --git a/sources b/sources
index bb941c1..024c845 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
 4981307aa9619bbec5b73261e4e41c8d  gdb-libstdc++-v3-python-r155978.tar.bz2
-6912a3a243a66a5fa04dc38aad3e8e80  gdb-7.7.90.20140711.tar.bz2
+e482a840e0bf8e928268c72cb2241646  gdb-7.7.91.20140721.tar.bz2


More information about the scm-commits mailing list