This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] rs6000-tdep.c:skip_prologue avoid negative left shift


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=1cc62f2e4443384e300586683aa1f8197c81cbc5

commit 1cc62f2e4443384e300586683aa1f8197c81cbc5
Author: Joel Brobecker <brobecker@adacore.com>
Date:   Thu Nov 1 16:46:05 2018 -0500

    rs6000-tdep.c:skip_prologue avoid negative left shift
    
    the rs6000-tdep.c::skip_prologue function has the following code:
    
              unsigned int all_mask = ~((1U << fdata->saved_gpr) - 1);
    
              /* Not a recognized prologue instruction.
                 Handle optimizer code motions into the prologue by continuing
                 the search if we have no valid frame yet or if the return
                 address is not yet saved in the frame.  Also skip instructions
                 if some of the GPRs expected to be saved are not yet saved.  */
              if (fdata->frameless == 0 && fdata->nosavedpc == 0
                  && (fdata->gpr_mask & all_mask) == all_mask)
                break;
    
    The problem is that fdata->saved_gpr is initialized to -1, and so,
    if no instruction is found in the function's prologue that causes us
    to set that field to a non-negative value, the sanitizer crashes
    with the following message:
    
        rs6000-tdep.c:1965:34: runtime error: shift exponent -1 is negative
    
    This patch fixes the issue the by only doing the shift if saved_gpr
    is not negative. When saved_gpr is negative, we actually don't need
    the shift.
    
    gdb/ChangeLog:
    
            * rs6000-tdep.c (skip_prologue): Fix potential negative left
            shifting.
    
    Tested on ppc-linux native.
    Also tested on ppc-elf (baremetal) using AdaCore's testsuite.

Diff:
---
 gdb/ChangeLog     |  5 +++++
 gdb/rs6000-tdep.c | 11 +++++++----
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 075dd3d..9f220d9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2018-11-01  Joel Brobecker  <brobecker@adacore.com>
+
+	* rs6000-tdep.c (skip_prologue): Fix potential negative left
+	shifting.
+
 2018-11-01  Jerome Guitton  <guitton@adacore.com>
 	    Joel Brobecker  <brobecker@adacore.com>
 
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index 504de36..67c7a36 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -1975,16 +1975,19 @@ skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR lim_pc,
 
       else
 	{
-	  unsigned int all_mask = ~((1U << fdata->saved_gpr) - 1);
-
 	  /* Not a recognized prologue instruction.
 	     Handle optimizer code motions into the prologue by continuing
 	     the search if we have no valid frame yet or if the return
 	     address is not yet saved in the frame.  Also skip instructions
 	     if some of the GPRs expected to be saved are not yet saved.  */
 	  if (fdata->frameless == 0 && fdata->nosavedpc == 0
-	      && (fdata->gpr_mask & all_mask) == all_mask)
-	    break;
+	      && fdata->saved_gpr != -1)
+	    {
+	      unsigned int all_mask = ~((1U << fdata->saved_gpr) - 1);
+
+	      if ((fdata->gpr_mask & all_mask) == all_mask)
+		break;
+	    }
 
 	  if (op == 0x4e800020		/* blr */
 	      || op == 0x4e800420)	/* bctr */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]