This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
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;