aboutsummaryrefslogtreecommitdiff
path: root/gdb/m32c-tdep.c
diff options
context:
space:
mode:
authorKevin Buettner <kevinb@redhat.com>2010-04-16 22:46:27 +0000
committerKevin Buettner <kevinb@redhat.com>2010-04-16 22:46:27 +0000
commitd77b48cf13221fee2bd7047d12f5594db3127cb3 (patch)
tree256f7fc1e560a519857f3ed9be0cbd9bb4235b23 /gdb/m32c-tdep.c
parent9e3223abf45d22382510a7a48ca0eeafd21dbe8f (diff)
* 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.
Diffstat (limited to 'gdb/m32c-tdep.c')
-rw-r--r--gdb/m32c-tdep.c53
1 files changed, 46 insertions, 7 deletions
diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c
index e776cb1eb1..6f640d5384 100644
--- a/gdb/m32c-tdep.c
+++ b/gdb/m32c-tdep.c
@@ -2431,8 +2431,8 @@ m32c_m16c_address_to_pointer (struct gdbarch *gdbarch,
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 gdbarch *gdbarch,
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;
+
+ /* 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;
- /* The trampoline's address is our pointer. */
- addr = SYMBOL_VALUE_ADDRESS (tramp_msym);
+ }
+ 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 gdbarch *gdbarch,
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;