summaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2005-12-05 22:46:21 +0000
committerRoland McGrath <roland@redhat.com>2005-12-05 22:46:21 +0000
commit994b4899278199fc4d307780dac0ea50b238bc74 (patch)
tree319952538a8556fa7f4d1ffcb4ae258fc6c47a5b /backends
parent038129b11ac71a13ccaf9029122be86d6c532990 (diff)
downloadelfutils-994b4899278199fc4d307780dac0ea50b238bc74.tar.gz
merge of 2cc527e6d8c8ff19dab478f7d12e58f1cfa6d6f5
and 7b542932f3e2947183b45bdbf39d448f457da9fd
Diffstat (limited to 'backends')
-rw-r--r--backends/ChangeLog21
-rw-r--r--backends/Makefile.am12
-rw-r--r--backends/i386_init.c1
-rw-r--r--backends/i386_regs.c109
-rw-r--r--backends/ppc64_init.c1
-rw-r--r--backends/ppc_init.c1
-rw-r--r--backends/ppc_regs.c147
-rw-r--r--backends/sparc_init.c1
-rw-r--r--backends/sparc_regs.c64
-rw-r--r--backends/x86_64_init.c1
-rw-r--r--backends/x86_64_regs.c113
11 files changed, 466 insertions, 5 deletions
diff --git a/backends/ChangeLog b/backends/ChangeLog
index aea3de30..defd725f 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,24 @@
+2005-12-05 Roland McGrath <roland@redhat.com>
+
+ * i386_regs.c (i386_register_name): Use a table for the first 8 regs.
+ * x86_64_regs.c (x86_64_register_name): Likewise.
+
+2005-11-25 Roland McGrath <roland@redhat.com>
+
+ * i386_regs.c (i386_register_name): Return 0, not 1, for gaps.
+
+ * i386_regs.c: New file.
+ * ppc_regs.c: New file.
+ * sparc_regs.c: New file.
+ * x86_64_regs.c: New file.
+ * Makefile.am
+ (i386_SRCS, x86_64_SRCS, ppc_SRCS, ppc64_SRCS, sparc_SRCS): Add them.
+ * i386_init.c: Initialize register_name hook.
+ * ppc_init.c: Likewise.
+ * ppc64_init.c: Likewise.
+ * sparc_init.c: Likewise.
+ * x86_64_init.c: Likewise.
+
2005-11-19 Roland McGrath <roland@redhat.com>
* ppc64_reloc.def: REL30 -> ADDR30.
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 9de055c5..9503d9d2 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -58,7 +58,8 @@ libebl_%.map: Makefile
echo 'ELFUTILS_$(PACKAGE_VERSION) { global: $*_init; local: *; };' > $@
-i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c i386_retval.c
+i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c \
+ i386_retval.c i386_regs.c
libebl_i386_pic_a_SOURCES = $(i386_SRCS)
am_libebl_i386_pic_a_OBJECTS = $(i386_SRCS:.c=.os)
@@ -66,7 +67,8 @@ sh_SRCS = sh_init.c sh_symbol.c
libebl_sh_pic_a_SOURCES = $(sh_SRCS)
am_libebl_sh_pic_a_OBJECTS = $(sh_SRCS:.c=.os)
-x86_64_SRCS = x86_64_init.c x86_64_symbol.c x86_64_corenote.c x86_64_retval.c
+x86_64_SRCS = x86_64_init.c x86_64_symbol.c x86_64_corenote.c \
+ x86_64_retval.c x86_64_regs.c
libebl_x86_64_pic_a_SOURCES = $(x86_64_SRCS)
am_libebl_x86_64_pic_a_OBJECTS = $(x86_64_SRCS:.c=.os)
@@ -82,15 +84,15 @@ arm_SRCS = arm_init.c arm_symbol.c
libebl_arm_pic_a_SOURCES = $(arm_SRCS)
am_libebl_arm_pic_a_OBJECTS = $(arm_SRCS:.c=.os)
-sparc_SRCS = sparc_init.c sparc_symbol.c
+sparc_SRCS = sparc_init.c sparc_symbol.c sparc_regs.c
libebl_sparc_pic_a_SOURCES = $(sparc_SRCS)
am_libebl_sparc_pic_a_OBJECTS = $(sparc_SRCS:.c=.os)
-ppc_SRCS = ppc_init.c ppc_symbol.c ppc_retval.c
+ppc_SRCS = ppc_init.c ppc_symbol.c ppc_retval.c ppc_regs.c
libebl_ppc_pic_a_SOURCES = $(ppc_SRCS)
am_libebl_ppc_pic_a_OBJECTS = $(ppc_SRCS:.c=.os)
-ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c
+ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c ppc_regs.c
libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS)
am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os)
diff --git a/backends/i386_init.c b/backends/i386_init.c
index 3c9bd371..da59eb38 100644
--- a/backends/i386_init.c
+++ b/backends/i386_init.c
@@ -43,6 +43,7 @@ i386_init (elf, machine, eh, ehlen)
generic_debugscn_p = eh->debugscn_p;
HOOK (eh, debugscn_p);
HOOK (eh, return_value_location);
+ HOOK (eh, register_name);
return MODVERSION;
}
diff --git a/backends/i386_regs.c b/backends/i386_regs.c
new file mode 100644
index 00000000..f79cda74
--- /dev/null
+++ b/backends/i386_regs.c
@@ -0,0 +1,109 @@
+/* Register names and numbers for i386 DWARF.
+ Copyright (C) 2005 Red Hat, Inc.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#define BACKEND i386_
+#include "libebl_CPU.h"
+
+ssize_t
+i386_register_name (Ebl *ebl __attribute__ ((unused)),
+ int regno, char *name, size_t namelen,
+ const char **prefix, const char **setname)
+{
+ if (name == NULL)
+ return 46;
+
+ if (regno < 0 || regno > 45 || namelen < 6)
+ return -1;
+
+ *prefix = "%";
+ if (regno < 11)
+ *setname = "integer";
+ else if (regno < 19)
+ *setname = "x87";
+ else if (regno < 29)
+ *setname = "SSE";
+ else if (regno < 37)
+ *setname = "MMX";
+ else if (regno < 40)
+ *setname = "FPU-control";
+ else
+ *setname = "segment";
+
+ switch (regno)
+ {
+ static const char baseregs[][2] =
+ {
+ "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "ip"
+ };
+
+ case 0 ... 8:
+ name[0] = 'e';
+ name[1] = baseregs[regno][0];
+ name[2] = baseregs[regno][1];
+ namelen = 3;
+ break;
+
+ case 9:
+ return stpcpy (name, "eflags") - name;
+ case 10:
+ return stpcpy (name, "trapno") - name;
+
+ case 11 ... 18:
+ name[0] = 's';
+ name[1] = 't';
+ name[2] = regno - 11 + '0';
+ namelen = 3;
+ break;
+
+ case 21 ... 28:
+ name[0] = 'x';
+ name[1] = 'm';
+ name[2] = 'm';
+ name[3] = regno - 21 + '0';
+ namelen = 4;
+ break;
+
+ case 29 ... 36:
+ name[0] = 'm';
+ name[1] = 'm';
+ name[2] = regno - 29 + '0';
+ namelen = 3;
+ break;
+
+ case 37:
+ return stpcpy (name, "fctrl") - name;
+ case 38:
+ return stpcpy (name, "fstat") - name;
+ case 39:
+ return stpcpy (name, "mxcsr") - name;
+
+ case 40 ... 45:
+ name[0] = "ecsdfg"[regno - 40];
+ name[1] = 's';
+ namelen = 2;
+ break;
+
+ default:
+ *setname = NULL;
+ return 0;
+ }
+
+ name[namelen++] = '\0';
+ return namelen;
+}
diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c
index c8e08380..29907b6b 100644
--- a/backends/ppc64_init.c
+++ b/backends/ppc64_init.c
@@ -45,6 +45,7 @@ ppc64_init (elf, machine, eh, ehlen)
HOOK (eh, check_special_symbol);
HOOK (eh, bss_plt_p);
HOOK (eh, return_value_location);
+ HOOK (eh, register_name);
return MODVERSION;
}
diff --git a/backends/ppc_init.c b/backends/ppc_init.c
index e2ad85c8..3e71474c 100644
--- a/backends/ppc_init.c
+++ b/backends/ppc_init.c
@@ -44,6 +44,7 @@ ppc_init (elf, machine, eh, ehlen)
HOOK (eh, check_special_symbol);
HOOK (eh, bss_plt_p);
HOOK (eh, return_value_location);
+ HOOK (eh, register_name);
return MODVERSION;
}
diff --git a/backends/ppc_regs.c b/backends/ppc_regs.c
new file mode 100644
index 00000000..76a36624
--- /dev/null
+++ b/backends/ppc_regs.c
@@ -0,0 +1,147 @@
+/* Register names and numbers for PowerPC DWARF.
+ Copyright (C) 2005 Red Hat, Inc.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#define BACKEND ppc_
+#include "libebl_CPU.h"
+
+ssize_t
+ppc_register_name (Ebl *ebl __attribute__ ((unused)),
+ int regno, char *name, size_t namelen,
+ const char **prefix, const char **setname)
+{
+ if (name == NULL)
+ return 1156;
+
+ if (regno < 0 || regno > 1155 || namelen < 7)
+ return -1;
+
+ *prefix = NULL;
+
+ if (regno < 32 || regno == 64 || regno == 66)
+ *setname = "integer";
+ else if (regno < 64 || regno == 65)
+ *setname = "FPU";
+ else if (regno < 1124)
+ *setname = "privileged";
+ else
+ *setname = "vector";
+
+ switch (regno)
+ {
+ case 0 ... 9:
+ name[0] = 'r';
+ name[1] = regno + '0';
+ namelen = 2;
+ break;
+
+ case 10 ... 31:
+ name[0] = 'r';
+ name[1] = regno / 10 + '0';
+ name[2] = regno % 10 + '0';
+ namelen = 3;
+ break;
+
+ case 32 + 0 ... 32 + 9:
+ name[0] = 'f';
+ name[1] = (regno - 32) + '0';
+ namelen = 2;
+ break;
+
+ case 32 + 10 ... 32 + 31:
+ name[0] = 'f';
+ name[1] = (regno - 32) / 10 + '0';
+ name[2] = (regno - 32) % 10 + '0';
+ namelen = 3;
+ break;
+
+ case 64:
+ return stpcpy (name, "cr") - name;
+ case 65:
+ return stpcpy (name, "fpscr") - name;
+ case 66:
+ return stpcpy (name, "msr") - name;
+
+ case 70 + 0 ... 70 + 9:
+ name[0] = 's';
+ name[1] = 'r';
+ name[2] = (regno - 70) + '0';
+ namelen = 3;
+ break;
+
+ case 70 + 10 ... 70 + 15:
+ name[0] = 's';
+ name[1] = 'r';
+ name[2] = (regno - 70) / 10 + '0';
+ name[3] = (regno - 70) % 10 + '0';
+ namelen = 4;
+ break;
+
+ case 100 ... 109:
+ name[0] = 's';
+ name[1] = 'p';
+ name[2] = 'r';
+ name[3] = (regno - 100) + '0';
+ namelen = 4;
+ break;
+
+ case 110 ... 199:
+ name[0] = 's';
+ name[1] = 'p';
+ name[2] = 'r';
+ name[3] = (regno - 100) / 10 + '0';
+ name[4] = (regno - 100) % 10 + '0';
+ namelen = 5;
+ break;
+
+ case 200 ... 999:
+ name[0] = 's';
+ name[1] = 'p';
+ name[2] = 'r';
+ name[3] = (regno - 100) / 100 + '0';
+ name[4] = ((regno - 100) % 100 / 10) + '0';
+ name[5] = (regno - 100) % 10 + '0';
+ namelen = 6;
+ break;
+
+ case 1124 + 0 ... 1124 + 9:
+ name[0] = 'v';
+ name[1] = 'r';
+ name[2] = (regno - 1124) + '0';
+ namelen = 3;
+ break;
+
+ case 1124 + 10 ... 1124 + 31:
+ name[0] = 'v';
+ name[1] = 'r';
+ name[2] = (regno - 1124) / 10 + '0';
+ name[3] = (regno - 1124) % 10 + '0';
+ namelen = 4;
+ break;
+
+ default:
+ *setname = NULL;
+ return 0;
+ }
+
+ name[namelen++] = '\0';
+ return namelen;
+}
+
+__typeof (ppc_register_name)
+ ppc64_register_name __attribute__ ((alias ("ppc_register_name")));
diff --git a/backends/sparc_init.c b/backends/sparc_init.c
index a287d1e4..420f3400 100644
--- a/backends/sparc_init.c
+++ b/backends/sparc_init.c
@@ -44,6 +44,7 @@ sparc_init (elf, machine, eh, ehlen)
sparc_init_reloc (eh);
HOOK (eh, reloc_simple_type);
//HOOK (eh, core_note);
+ HOOK (eh, register_name);
return MODVERSION;
}
diff --git a/backends/sparc_regs.c b/backends/sparc_regs.c
new file mode 100644
index 00000000..a88e53b7
--- /dev/null
+++ b/backends/sparc_regs.c
@@ -0,0 +1,64 @@
+/* Register names and numbers for SPARC DWARF.
+ Copyright (C) 2005 Red Hat, Inc.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#define BACKEND sparc_
+#include "libebl_CPU.h"
+
+ssize_t
+sparc_register_name (Ebl *ebl,
+ int regno, char *name, size_t namelen,
+ const char **prefix, const char **setname)
+{
+ const int nfp = ebl->machine == EM_SPARCV9 ? 64 : 32;
+
+ if (name == NULL)
+ return 32 + nfp;
+
+ if (regno < 0 || regno >= 32 + nfp || namelen < 4)
+ return -1;
+
+ *prefix = "%";
+
+ if (regno < 32)
+ {
+ *setname = "integer";
+ name[0] = "goli"[regno >> 3];
+ name[1] = (regno & 7) + '0';
+ namelen = 2;
+ }
+ else
+ {
+ *setname = "FPU";
+ name[0] = 'f';
+ if (regno < 32 + 10)
+ {
+ name[1] = (regno - 32) + '0';
+ namelen = 2;
+ }
+ else
+ {
+ name[1] = (regno - 32) / 10 + '0';
+ name[2] = (regno - 32) % 10 + '0';
+ namelen = 3;
+ }
+ }
+
+ name[namelen++] = '\0';
+ return namelen;
+}
diff --git a/backends/x86_64_init.c b/backends/x86_64_init.c
index fe877575..a7ba231e 100644
--- a/backends/x86_64_init.c
+++ b/backends/x86_64_init.c
@@ -42,6 +42,7 @@ x86_64_init (elf, machine, eh, ehlen)
HOOK (eh, reloc_simple_type);
HOOK (eh, core_note);
HOOK (eh, return_value_location);
+ HOOK (eh, register_name);
return MODVERSION;
}
diff --git a/backends/x86_64_regs.c b/backends/x86_64_regs.c
new file mode 100644
index 00000000..4fae67aa
--- /dev/null
+++ b/backends/x86_64_regs.c
@@ -0,0 +1,113 @@
+/* Register names and numbers for x86-64 DWARF.
+ Copyright (C) 2005 Red Hat, Inc.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <dwarf.h>
+
+#define BACKEND x86_64_
+#include "libebl_CPU.h"
+
+ssize_t
+x86_64_register_name (Ebl *ebl __attribute__ ((unused)),
+ int regno, char *name, size_t namelen,
+ const char **prefix, const char **setname)
+{
+ if (name == NULL)
+ return 49;
+
+ if (regno < 0 || regno > 48 || namelen < 6)
+ return -1;
+
+ *prefix = "%";
+ if (regno < 17)
+ *setname = "integer";
+ else if (regno < 33)
+ *setname = "SSE";
+ else if (regno < 41)
+ *setname = "x87";
+ else
+ *setname = "MMX";
+
+ switch (regno)
+ {
+ static const char baseregs[][2] =
+ {
+ "ax", "dx", "cx", "bx", "si", "di", "bp", "sp"
+ };
+
+ case 0 ... 7:
+ name[0] = 'r';
+ name[1] = baseregs[regno][0];
+ name[2] = baseregs[regno][1];
+ namelen = 3;
+ break;
+
+ case 8 ... 9:
+ name[0] = 'r';
+ name[1] = regno - 8 + '8';
+ namelen = 2;
+ break;
+
+ case 10 ... 15:
+ name[0] = 'r';
+ name[1] = '1';
+ name[2] = regno - 10 + '0';
+ namelen = 3;
+ break;
+
+ case 16:
+ name[0] = 'r';
+ name[1] = 'i';
+ name[2] = 'p';
+ namelen = 3;
+ break;
+
+ case 17 ... 26:
+ name[0] = 'x';
+ name[1] = 'm';
+ name[2] = 'm';
+ name[3] = regno - 17 + '0';
+ namelen = 4;
+ break;
+
+ case 27 ... 32:
+ name[0] = 'x';
+ name[1] = 'm';
+ name[2] = 'm';
+ name[3] = '1';
+ name[4] = regno - 27 + '0';
+ namelen = 5;
+ break;
+
+ case 33 ... 40:
+ name[0] = 's';
+ name[1] = 't';
+ name[2] = regno - 33 + '0';
+ namelen = 3;
+ break;
+
+ case 41 ... 48:
+ name[0] = 'm';
+ name[1] = 'm';
+ name[2] = regno - 41 + '0';
+ namelen = 3;
+ break;
+ }
+
+ name[namelen++] = '\0';
+ return namelen;
+}