This is the mail archive of the gdb-patches@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]

Re: [RFC] m32c: Print warning instead of error in address->pointer function


On Tue, 13 Apr 2010 08:38:55 -0700
Joel Brobecker <brobecker@adacore.com> wrote:

> > 	* m32c-tdep.c (m32c_m16c_address_to_pointer): Print warning
> > 	instead of an error if no PLT entry is found.  Return a
> > 	potentially useful result.
> > 	(m32c_m16c_pointer_to_address): Add code to search for function
> > 	address when no .plt entry is found.
> 
> No objection on my end. Don't know if there is any better alternative
> anyway, and an improvement is an improvement ;-).
> 
> I just noticed that you forgot to bracket the warning text with _()...
> 
> > +	  warning ("Cannot convert code address %s to function pointer:\n"
> > +		   "couldn't find trampoline named '%s.plt'.\n"
> > +		   "Returning pointer value %s instead; this may produce\n"
> > +		   "a useful result if converted back into an address by GDB,\n"
> > +		   "but will most likely not be useful otherwise.\n",
> > +		   paddress (gdbarch, addr), func_name,
> > +		   paddress (gdbarch, ptrval));

Thanks for looking it over.  I ended up committing the patch below.

I bracketed the warning message with _().  I added the _() bracketing
to an error message im m32c_m16c_address_to_pointer() too.

	* m32c-tdep.c (m32c_m16c_address_to_pointer): Print warning
	instead of an error if no PLT entry is found.  Return a
	potentially useful result.
	(m32c_m16c_pointer_to_address): Add code to search for function
	address when no .plt entry is found.

Index: m32c-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/m32c-tdep.c,v
retrieving revision 1.36
diff -u -p -r1.36 m32c-tdep.c
--- m32c-tdep.c	6 Apr 2010 00:14:43 -0000	1.36
+++ m32c-tdep.c	16 Apr 2010 22:43:40 -0000
@@ -2431,8 +2431,8 @@ m32c_m16c_address_to_pointer (struct gdb
       struct minimal_symbol *func_msym = lookup_minimal_symbol_by_pc (addr);
 
       if (! func_msym)
-        error ("Cannot convert code address %s to function pointer:\n"
-               "couldn't find a symbol at that address, to find trampoline.",
+        error (_("Cannot convert code address %s to function pointer:\n"
+               "couldn't find a symbol at that address, to find trampoline."),
                paddress (gdbarch, addr));
 
       func_name = SYMBOL_LINKAGE_NAME (func_msym);
@@ -2448,12 +2448,39 @@ m32c_m16c_address_to_pointer (struct gdb
       xfree (tramp_name);
 
       if (! tramp_msym)
-        error ("Cannot convert code address %s to function pointer:\n"
-               "couldn't find trampoline named '%s.plt'.",
-               paddress (gdbarch, addr), func_name);
+	{
+	  CORE_ADDR ptrval;
 
-      /* The trampoline's address is our pointer.  */
-      addr = SYMBOL_VALUE_ADDRESS (tramp_msym);
+	  /* No PLT entry found.  Mask off the upper bits of the address
+	     to make a pointer.  As noted in the warning to the user
+	     below, this value might be useful if converted back into
+	     an address by GDB, but will otherwise, almost certainly,
+	     be garbage.
+	     
+	     Using this masked result does seem to be useful
+	     in gdb.cp/cplusfuncs.exp in which ~40 FAILs turn into
+	     PASSes.  These results appear to be correct as well.
+	     
+	     We print a warning here so that the user can make a
+	     determination about whether the result is useful or not.  */
+	  ptrval = addr & 0xffff;
+
+	  warning (_("Cannot convert code address %s to function pointer:\n"
+		   "couldn't find trampoline named '%s.plt'.\n"
+		   "Returning pointer value %s instead; this may produce\n"
+		   "a useful result if converted back into an address by GDB,\n"
+		   "but will most likely not be useful otherwise.\n"),
+		   paddress (gdbarch, addr), func_name,
+		   paddress (gdbarch, ptrval));
+
+	  addr = ptrval;
+
+	}
+      else
+	{
+	  /* The trampoline's address is our pointer.  */
+	  addr = SYMBOL_VALUE_ADDRESS (tramp_msym);
+	}
     }
 
   store_unsigned_integer (buf, TYPE_LENGTH (type), byte_order, addr);
@@ -2508,6 +2535,18 @@ m32c_m16c_pointer_to_address (struct gdb
                 ptr = SYMBOL_VALUE_ADDRESS (func_msym);
             }
         }
+      else
+	{
+	  int aspace;
+
+	  for (aspace = 1; aspace <= 15; aspace++)
+	    {
+	      ptr_msym = lookup_minimal_symbol_by_pc ((aspace << 16) | ptr);
+	      
+	      if (ptr_msym)
+		ptr |= aspace << 16;
+	    }
+	}
     }
 
   return ptr;


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