CACAO
disass.c
Go to the documentation of this file.
1 /* src/vm/jit/x86_64/disass.c - wrapper functions for GNU binutils disassembler
2 
3  Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
4  C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5  E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6  J. Wenninger, Institut f. Computersprachen - TU Wien
7 
8  This file is part of CACAO.
9 
10  This program is free software; you can redistribute it and/or
11  modify it under the terms of the GNU General Public License as
12  published by the Free Software Foundation; either version 2, or (at
13  your option) any later version.
14 
15  This program is distributed in the hope that it will be useful, but
16  WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with this program; if not, write to the Free Software
22  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23  02110-1301, USA.
24 
25  Contact: cacao@cacaojvm.org
26 
27  Authors: Andreas Krall
28  Reinhard Grafl
29 
30  Changes: Christian Thalinger
31 
32 */
33 
34 
35 #include "config.h"
36 
37 #include <dis-asm.h>
38 #include <stdio.h>
39 #include <stdint.h>
40 
41 #include "vm/types.hpp"
42 
43 #include "vm/global.hpp"
44 #include "vm/jit/disass.hpp"
45 
46 
47 /* global variables ***********************************************************/
48 
49 /* name table for 16 integer registers */
50 
51 char *regs[] = {
52  "r0",
53  "r1",
54  "r2",
55  "r3",
56  "r4",
57  "r5",
58  "r6",
59  "r7",
60  "r8",
61  "r9",
62  "r10",
63  "r11",
64  "r12",
65  "r13",
66  "r14",
67  "r15"
68 };
69 
70 
71 /* disass_pseudo_instr *********************************************************
72 
73  Outputs a disassembler listing of one pseudo instruction instruction on
74  `stdout'.
75 
76  Returns number of bytes consumed or 0 if code does not contain a pseudo
77  instruction.
78 
79  code: pointer to machine code
80 
81 *******************************************************************************/
82 
83 static s4 disass_pseudo_instr(u1 *code) {
84  switch (code[0]) {
85  /* Trap */
86  case 0x02:
87  snprintf(disass_buf, 512, "ill\t0x%02x (pseudo)", (int)code[1]);
88  return 2;
89  /* Not recognized */
90  default:
91  return 0;
92  }
93 }
94 
95 /* disassinstr *****************************************************************
96 
97  Outputs a disassembler listing of one machine code instruction on
98  `stdout'.
99 
100  code: pointer to machine code
101 
102 *******************************************************************************/
103 
105 {
106  s4 seqlen;
107  s4 i;
108 
109  if (!disass_initialized) {
110  INIT_DISASSEMBLE_INFO(info, NULL, disass_printf);
111 
112  /* setting the struct members must be done after
113  INIT_DISASSEMBLE_INFO */
114 
115  info.mach = bfd_mach_s390_31;
116  info.read_memory_func = &disass_buffer_read_memory;
117 
118  disass_initialized = true;
119  }
120 
121  printf("0x%08x: ", (s4) code);
122 
123  disass_len = 0;
124 
125  seqlen = disass_pseudo_instr(code);
126 
127  if (seqlen == 0) {
128  seqlen = print_insn_s390((bfd_vma)(intptr_t)code, &info);
129  }
130 
131  for (i = 0; i < seqlen; i++, code++) {
132  printf("%02x ", *code);
133  }
134 
135  for (; i < 10; i++) {
136  printf(" ");
137  }
138 
139  printf(" %s\n", disass_buf);
140 
141  return code;
142 }
143 
144 
145 /*
146  * These are local overrides for various environment variables in Emacs.
147  * Please do not remove this and leave it at the end of the file, where
148  * Emacs will automagically detect them.
149  * ---------------------------------------------------------------------
150  * Local variables:
151  * mode: c
152  * indent-tabs-mode: t
153  * c-basic-offset: 4
154  * tab-width: 4
155  * End:
156  */
int disass_buffer_read_memory(bfd_vma memaddr, bfd_byte *myaddr, unsigned int length, struct disassemble_info *info)
char * regs[]
Definition: disass.c:51
u1 * disassinstr(u1 *code)
Definition: disass.cpp:48
uint8_t u1
Definition: types.hpp:40
MIIterator i
int32_t s4
Definition: types.hpp:45
static s4 disass_pseudo_instr(u1 *code)
Definition: disass.c:83
void disass_printf(PTR p, const char *fmt,...)
#define printf(...)
Definition: ssa2.cpp:40