diff options
author | Alan Modra <amodra@gmail.com> | 2005-03-09 13:08:26 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2005-03-09 13:08:26 +0000 |
commit | 220abb21d1516ccb237389002b6c302c3295d8a0 (patch) | |
tree | 7d75b35abfc7fe20f0f9e23e5499bd529ff8d756 /opcodes/vax-dis.c | |
parent | 4184909a51545bf4b539d9e9e5e03965f0ad1a02 (diff) | |
download | gdb-220abb21d1516ccb237389002b6c302c3295d8a0.zip gdb-220abb21d1516ccb237389002b6c302c3295d8a0.tar.gz gdb-220abb21d1516ccb237389002b6c302c3295d8a0.tar.bz2 |
* 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.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/opcodes/vax-dis.c b/opcodes/vax-dis.c index a97d4cd..bac6291 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; |