diff options
| author | Roland McGrath <[email protected]> | 2007-04-01 23:11:40 +0000 |
|---|---|---|
| committer | Roland McGrath <[email protected]> | 2007-04-01 23:11:40 +0000 |
| commit | 5f6a41a8484d110cb38b0989a3a240dc28fd7310 (patch) | |
| tree | ddeb093a05366ffec4dff1d437f70e3cbe2bae19 /backends | |
| parent | a1090f89b4916191c42ca54a1c9e0b05166f95df (diff) | |
backends/
2007-04-01 Roland McGrath <[email protected]>
* x86_64_regs.c (x86_64_register_info): Add more registers from newer
ABI spec.
tests/
2007-04-01 Roland McGrath <[email protected]>
* run-allregs.sh: Updated expected output for x86_64.
Diffstat (limited to 'backends')
| -rw-r--r-- | backends/ChangeLog | 5 | ||||
| -rw-r--r-- | backends/x86_64_regs.c | 58 |
2 files changed, 52 insertions, 11 deletions
diff --git a/backends/ChangeLog b/backends/ChangeLog index 57f33608..e9f34158 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,3 +1,8 @@ +2007-04-01 Roland McGrath <[email protected]> + + * x86_64_regs.c (x86_64_register_info): Add more registers from newer + ABI spec. + 2007-01-11 Roland McGrath <[email protected]> * ia64_symbol.c (ia64_machine_section_flag_check): New function. diff --git a/backends/x86_64_regs.c b/backends/x86_64_regs.c index 1128a352..c17af85e 100644 --- a/backends/x86_64_regs.c +++ b/backends/x86_64_regs.c @@ -1,5 +1,5 @@ /* Register names and numbers for x86-64 DWARF. - Copyright (C) 2005, 2006 Red Hat, Inc. + Copyright (C) 2005, 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -29,6 +29,7 @@ #include <assert.h> #include <dwarf.h> +#include <string.h> #define BACKEND x86_64_ #include "libebl_CPU.h" @@ -40,9 +41,9 @@ x86_64_register_info (Ebl *ebl __attribute__ ((unused)), int *bits, int *type) { if (name == NULL) - return 49; + return 67; - if (regno < 0 || regno > 48 || namelen < 6) + if (regno < 0 || regno > 66 || namelen < 7) return -1; *prefix = "%"; @@ -51,10 +52,7 @@ x86_64_register_info (Ebl *ebl __attribute__ ((unused)), if (regno < 17) { *setname = "integer"; - if (regno == 16 || regno == 6 || regno == 7) - *type = DW_ATE_address; - else - *type = DW_ATE_signed; + *type = DW_ATE_signed; } else if (regno < 33) { @@ -67,11 +65,15 @@ x86_64_register_info (Ebl *ebl __attribute__ ((unused)), *type = DW_ATE_float; *bits = 80; } - else + else if (regno < 49) + *setname = "MMX"; + else if (regno > 49 && regno < 60) { - *setname = "MMX"; - *bits = 64; + *setname = "segment"; + *bits = 16; } + else + *setname = "control"; switch (regno) { @@ -80,7 +82,9 @@ x86_64_register_info (Ebl *ebl __attribute__ ((unused)), "ax", "dx", "cx", "bx", "si", "di", "bp", "sp" }; - case 0 ... 7: + case 6 ... 7: + *type = DW_ATE_address; + case 0 ... 5: name[0] = 'r'; name[1] = baseregs[regno][0]; name[2] = baseregs[regno][1]; @@ -101,6 +105,7 @@ x86_64_register_info (Ebl *ebl __attribute__ ((unused)), break; case 16: + *type = DW_ATE_address; name[0] = 'r'; name[1] = 'i'; name[2] = 'p'; @@ -137,6 +142,37 @@ x86_64_register_info (Ebl *ebl __attribute__ ((unused)), name[2] = regno - 41 + '0'; namelen = 3; break; + + case 50 ... 55: + name[0] = "ecsdfg"[regno - 50]; + name[1] = 's'; + namelen = 2; + break; + + case 58 ... 59: + *type = DW_ATE_address; + *bits = 64; + name[0] = regno - 58 + 'f'; + return stpcpy (&name[1], "s.base") + 1 - name; + + case 49: + return stpcpy (name, "rflags") + 1 - name; + case 62: + return stpcpy (name, "tr") + 1 - name; + case 63: + return stpcpy (name, "ldtr") + 1 - name; + case 64: + return stpcpy (name, "mxcsr") + 1 - name; + + case 65 ... 66: + name[0] = 'f'; + name[1] = "cs"[regno - 65]; + name[2] = 'w'; + namelen = 3; + break; + + default: + return 0; } name[namelen++] = '\0'; |
