Blame SOURCES/gdb-rhbz795424-bitpos-25of25.patch

4c2ad1
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
4c2ad1
From: Fedora GDB patches <invalid@email.com>
4c2ad1
Date: Fri, 27 Oct 2017 21:07:50 +0200
4c2ad1
Subject: gdb-rhbz795424-bitpos-25of25.patch
4c2ad1
4c2ad1
;; Fix `GDB cannot access struct member whose offset is larger than 256MB'
4c2ad1
;; (RH BZ 795424).
4c2ad1
;;=push
4c2ad1
4c2ad1
http://sourceware.org/ml/gdb-patches/2012-08/msg00562.html
4c2ad1
4c2ad1
--MP_/90J7bck2fqDySEX9JkZtaqL
4c2ad1
Content-Type: text/plain; charset=US-ASCII
4c2ad1
Content-Transfer-Encoding: 7bit
4c2ad1
Content-Disposition: inline
4c2ad1
4c2ad1
Hi,
4c2ad1
4c2ad1
Range bounds for a gdb type can have LONGEST values for low and high
4c2ad1
bounds. Fortran range bounds functions however use only int. The larger
4c2ad1
ranges don't compile by default on gcc, but it is possible to override
4c2ad1
the check in the compiler by using -fno-range-check. As a result, this
4c2ad1
check is necessary so that we don't print junk in case of an overflow.
4c2ad1
4c2ad1
Attached patch does this expansion and also includes a test case that
4c2ad1
verifies that the problem is fixed. I have also verified on x86_64 that
4c2ad1
this patch does not cause any regressions.
4c2ad1
4c2ad1
Regards,
4c2ad1
Siddhesh
4c2ad1
4c2ad1
gdb/ChangeLog:
4c2ad1
4c2ad1
	* f-lang.h (f77_get_upperbound): Return LONGEST.
4c2ad1
	(f77_get_lowerbound): Likewise.
4c2ad1
	* f-typeprint.c (f_type_print_varspec_suffix): Expand
4c2ad1
	UPPER_BOUND and LOWER_BOUND to LONGEST.  Use plongest to format
4c2ad1
	print them.
4c2ad1
	(f_type_print_base): Expand UPPER_BOUND to LONGEST.  Use
4c2ad1
	plongest to format print it.
4c2ad1
	* f-valprint.c (f77_get_lowerbound): Return LONGEST.
4c2ad1
	(f77_get_upperbound): Likewise.
4c2ad1
	(f77_get_dynamic_length_of_aggregate): Expand UPPER_BOUND,
4c2ad1
	LOWER_BOUND to LONGEST.
4c2ad1
	(f77_create_arrayprint_offset_tbl): Likewise.
4c2ad1
4c2ad1
testsuite/ChangeLog:
4c2ad1
4c2ad1
	* gdb.fortran/array-bounds.exp: New test case.
4c2ad1
	* gdb.fortran/array-bounds.f: New test case.
4c2ad1
4c2ad1
--MP_/90J7bck2fqDySEX9JkZtaqL
4c2ad1
Content-Type: text/x-patch
4c2ad1
Content-Transfer-Encoding: 7bit
4c2ad1
Content-Disposition: attachment; filename=f77-bounds.patch
4c2ad1
4c2ad1
diff --git a/gdb/f-lang.h b/gdb/f-lang.h
4c2ad1
--- a/gdb/f-lang.h
4c2ad1
+++ b/gdb/f-lang.h
4c2ad1
@@ -47,9 +47,9 @@ struct common_block
4c2ad1
   struct symbol *contents[1];
4c2ad1
 };
4c2ad1
 
4c2ad1
-extern int f77_get_upperbound (struct type *);
4c2ad1
+extern LONGEST f77_get_upperbound (struct type *);
4c2ad1
 
4c2ad1
-extern int f77_get_lowerbound (struct type *);
4c2ad1
+extern LONGEST f77_get_lowerbound (struct type *);
4c2ad1
 
4c2ad1
 extern void f77_get_dynamic_array_length (struct type *);
4c2ad1
 
4c2ad1
diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c
4c2ad1
--- a/gdb/f-typeprint.c
4c2ad1
+++ b/gdb/f-typeprint.c
4c2ad1
@@ -149,7 +149,7 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
4c2ad1
 			     int show, int passed_a_ptr, int demangled_args,
4c2ad1
 			     int arrayprint_recurse_level, int print_rank_only)
4c2ad1
 {
4c2ad1
-  int upper_bound, lower_bound;
4c2ad1
+  LONGEST upper_bound, lower_bound;
4c2ad1
 
4c2ad1
   /* No static variables are permitted as an error call may occur during
4c2ad1
      execution of this function.  */
4c2ad1
@@ -196,7 +196,7 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
4c2ad1
 	{
4c2ad1
 	  lower_bound = f77_get_lowerbound (type);
4c2ad1
 	  if (lower_bound != 1)	/* Not the default.  */
4c2ad1
-	    fprintf_filtered (stream, "%d:", lower_bound);
4c2ad1
+	    fprintf_filtered (stream, "%s:", plongest (lower_bound));
4c2ad1
 
4c2ad1
 	  /* Make sure that, if we have an assumed size array, we
4c2ad1
 	       print out a warning and print the upperbound as '*'.  */
4c2ad1
@@ -206,7 +206,7 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
4c2ad1
 	  else
4c2ad1
 	    {
4c2ad1
 	      upper_bound = f77_get_upperbound (type);
4c2ad1
-	      fprintf_filtered (stream, "%d", upper_bound);
4c2ad1
+	      fprintf_filtered (stream, "%s", plongest (upper_bound));
4c2ad1
 	    }
4c2ad1
 	}
4c2ad1
 
4c2ad1
@@ -278,7 +278,7 @@ void
4c2ad1
 f_type_print_base (struct type *type, struct ui_file *stream, int show,
4c2ad1
 		   int level)
4c2ad1
 {
4c2ad1
-  int upper_bound;
4c2ad1
+  LONGEST upper_bound;
4c2ad1
   int index;
4c2ad1
 
4c2ad1
   QUIT;
4c2ad1
@@ -370,7 +370,7 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show,
4c2ad1
       else
4c2ad1
 	{
4c2ad1
 	  upper_bound = f77_get_upperbound (type);
4c2ad1
-	  fprintf_filtered (stream, "character*%d", upper_bound);
4c2ad1
+	  fprintf_filtered (stream, "character*%s", plongest (upper_bound));
4c2ad1
 	}
4c2ad1
       break;
4c2ad1
 
4c2ad1
diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c
4c2ad1
--- a/gdb/f-valprint.c
4c2ad1
+++ b/gdb/f-valprint.c
4c2ad1
@@ -41,7 +41,7 @@ LONGEST f77_array_offset_tbl[MAX_FORTRAN_DIMS + 1][2];
4c2ad1
 /* Array which holds offsets to be applied to get a row's elements
4c2ad1
    for a given array.  Array also holds the size of each subarray.  */
4c2ad1
 
4c2ad1
-int
4c2ad1
+LONGEST
4c2ad1
 f77_get_lowerbound (struct type *type)
4c2ad1
 {
4c2ad1
   if (TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED (type))
4c2ad1
@@ -50,7 +50,7 @@ f77_get_lowerbound (struct type *type)
4c2ad1
   return TYPE_ARRAY_LOWER_BOUND_VALUE (type);
4c2ad1
 }
4c2ad1
 
4c2ad1
-int
4c2ad1
+LONGEST
4c2ad1
 f77_get_upperbound (struct type *type)
4c2ad1
 {
4c2ad1
   if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))