diff options
author | Roland McGrath <roland@redhat.com> | 2005-12-05 22:46:21 +0000 |
---|---|---|
committer | Roland McGrath <roland@redhat.com> | 2005-12-05 22:46:21 +0000 |
commit | 994b4899278199fc4d307780dac0ea50b238bc74 (patch) | |
tree | 319952538a8556fa7f4d1ffcb4ae258fc6c47a5b /backends | |
parent | 038129b11ac71a13ccaf9029122be86d6c532990 (diff) | |
download | elfutils-994b4899278199fc4d307780dac0ea50b238bc74.tar.gz |
merge of 2cc527e6d8c8ff19dab478f7d12e58f1cfa6d6f5
and 7b542932f3e2947183b45bdbf39d448f457da9fd
Diffstat (limited to 'backends')
-rw-r--r-- | backends/ChangeLog | 21 | ||||
-rw-r--r-- | backends/Makefile.am | 12 | ||||
-rw-r--r-- | backends/i386_init.c | 1 | ||||
-rw-r--r-- | backends/i386_regs.c | 109 | ||||
-rw-r--r-- | backends/ppc64_init.c | 1 | ||||
-rw-r--r-- | backends/ppc_init.c | 1 | ||||
-rw-r--r-- | backends/ppc_regs.c | 147 | ||||
-rw-r--r-- | backends/sparc_init.c | 1 | ||||
-rw-r--r-- | backends/sparc_regs.c | 64 | ||||
-rw-r--r-- | backends/x86_64_init.c | 1 | ||||
-rw-r--r-- | backends/x86_64_regs.c | 113 |
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; +} |