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]

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


The patch below fixes a number of failures for m32c-elf, around 40 in
gdb.cp/cplusfuncs.exp, and a handful in a few other places as well.

It changes the m32c address to pointer function so that it returns
a result which may be used to, most likely, obtain the original address
when passed to the m32c pointer to address function.  It does not,
however, return a correct pointer value because it does not refer a PLT
entry which may be called.  I.e. if a non-PLT pointer result produced
by m32c_m16c_address_to_pointer() were stuffed into a function pointer
variable in the inferior, and then called by the inferior, the result
would, almost certainly, not be correct.

The result can be useful though because there are more than a few
occassions where the address->pointer result is later passed to the
pointer->address function in order to obtain an address.  When used in
this manner, the results are usually pretty good.

The patch changes what used to be an error into a warning, thus
allowing the user to decide whether the actual results obtained are
useful or not.  If left as an error, the user has no chance to make
this determination even if the result might have been useful.

Comments?

	* 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	6 Apr 2010 04:12:39 -0000
@@ -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]