Index: sim/rx/load.c |
diff --git a/sim/rx/load.c b/sim/rx/load.c |
index 39eb26166ac5de1043eecb4937451694df4ca983..f6fc56e8545df013bea164823cfb37f124fd921b 100644 |
--- a/sim/rx/load.c |
+++ b/sim/rx/load.c |
@@ -28,9 +28,36 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#include "libbfd.h" |
#include "cpu.h" |
#include "mem.h" |
+#include "load.h" |
#include "elf/internal.h" |
#include "elf/common.h" |
+/* Helper function for invoking a GDB-specified printf. */ |
+static void |
+xprintf (host_callback *callback, const char *fmt, ...) |
+{ |
+ va_list ap; |
+ |
+ va_start (ap, fmt); |
+ |
+ (*callback->vprintf_filtered) (callback, fmt, ap); |
+ |
+ va_end (ap); |
+} |
+ |
+/* Given a file offset, look up the section name. */ |
+static const char * |
+find_section_name_by_offset (bfd *abfd, file_ptr filepos) |
+{ |
+ asection *s; |
+ |
+ for (s = abfd->sections; s; s = s->next) |
+ if (s->filepos == filepos) |
+ return bfd_get_section_name (abfd, s); |
+ |
+ return "(unknown)"; |
+} |
+ |
/* A note about endianness and swapping... |
The RX chip is CISC-like in that the opcodes are variable length |
@@ -56,7 +83,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
encoded in little-endian format. */ |
void |
-rx_load (bfd *prog) |
+rx_load (bfd *prog, host_callback *callback) |
{ |
unsigned long highest_addr_loaded = 0; |
Elf_Internal_Phdr * phdrs; |
@@ -105,6 +132,11 @@ rx_load (bfd *prog) |
if (verbose > 1) |
fprintf (stderr, "[load segment: lma=%08x vma=%08x size=%08x]\n", |
(int) base, (int) p->p_vaddr, (int) size); |
+ if (callback) |
+ xprintf (callback, |
+ "Loading section %s, size %#lx lma %08lx vma %08lx\n", |
+ find_section_name_by_offset (prog, p->p_offset), |
+ size, base, p->p_vaddr); |
buf = malloc (size); |
if (buf == NULL) |