summaryrefslogtreecommitdiff
path: root/opcodes/vax-dis.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2005-03-09 13:08:26 +0000
committerAlan Modra <amodra@bigpond.net.au>2005-03-09 13:08:26 +0000
commitb1d4d153d772391752f13ecc22f8c6d654a07409 (patch)
tree7103e12d48bec8ebad9dbbf1d8cad75165416c65 /opcodes/vax-dis.c
parent33af5e8dd8e95ee6577c03611c8cd35eef2289e8 (diff)
downloadgdb-b1d4d153d772391752f13ecc22f8c6d654a07409.tar.gz
* vax-dis.c (entry_mask_bit): New array.
(print_insn_vax): Decode function entry mask.
Diffstat (limited to 'opcodes/vax-dis.c')
-rw-r--r--opcodes/vax-dis.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/opcodes/vax-dis.c b/opcodes/vax-dis.c
index a97d4cd2578..bac6291baf9 100644
--- a/opcodes/vax-dis.c
+++ b/opcodes/vax-dis.c
@@ -1,5 +1,6 @@
/* Print VAX instructions.
- Copyright 1995, 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright 1995, 1998, 2000, 2001, 2002, 2005
+ Free Software Foundation, Inc.
Contributed by Pauline Middelink <middelin@polyware.iaf.nl>
This program is free software; you can redistribute it and/or modify
@@ -34,6 +35,21 @@ static char *reg_names[] =
"r8", "r9", "r10", "r11", "ap", "fp", "sp", "pc"
};
+/* Definitions for the function entry mask bits. */
+static char *entry_mask_bit[] =
+{
+ /* Registers 0 and 1 shall not be saved, since they're used to pass back
+ a function's result to it's caller... */
+ "~r0~", "~r1~",
+ /* Registers 2 .. 11 are normal registers. */
+ "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11",
+ /* Registers 12 and 13 are argument and frame pointer and must not
+ be saved by using the entry mask. */
+ "~ap~", "~fp~",
+ /* Bits 14 and 15 control integer and decimal overflow. */
+ "IntOvfl", "DecOvfl",
+};
+
/* Sign-extend an (unsigned char). */
#if __STDC__ == 1
#define COERCE_SIGNED_CHAR(ch) ((signed char)(ch))
@@ -140,6 +156,27 @@ print_insn_vax (memaddr, info)
buffer[1] = 0;
}
+ /* Decode function entry mask. */
+ if (info->symbols
+ && info->symbols[0]
+ && (info->symbols[0]->flags & BSF_FUNCTION)
+ && memaddr == bfd_asymbol_value (info->symbols[0]))
+ {
+ int i = 0;
+ int register_mask = buffer[1] << 8 | buffer[0];
+
+ (*info->fprintf_func) (info->stream, "Entry mask 0x%04x = <",
+ register_mask);
+
+ for (i = 15; i >= 0; i--)
+ if (register_mask & (1 << i))
+ (*info->fprintf_func) (info->stream, " %s", entry_mask_bit[i]);
+
+ (*info->fprintf_func) (info->stream, " >");
+
+ return 2;
+ }
+
for (votp = &votstrs[0]; votp->name[0]; votp++)
{
register vax_opcodeT opcode = votp->detail.code;