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

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