Mercurial > hg > truffle
comparison src/share/tools/hsdis/hsdis-demo.c @ 6782:5a98bf7d847b
6879063: SA should use hsdis for disassembly
Summary: We should in SA to use hsdis for it like the JVM does to replace the current java based disassembler.
Reviewed-by: twisti, jrose, sla
Contributed-by: yumin.qi@oracle.com
author | minqi |
---|---|
date | Mon, 24 Sep 2012 12:44:00 -0700 |
parents | 1d1603768966 |
children | 3d701c802d01 |
comparison
equal
deleted
inserted
replaced
6780:8440414b0fd8 | 6782:5a98bf7d847b |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
24 | 24 |
25 /* hsdis-demo.c -- dump a range of addresses as native instructions | 25 /* hsdis-demo.c -- dump a range of addresses as native instructions |
26 This demonstrates the protocol required by the HotSpot PrintAssembly option. | 26 This demonstrates the protocol required by the HotSpot PrintAssembly option. |
27 */ | 27 */ |
28 | 28 |
29 #include <stdio.h> | |
30 #include <stdlib.h> | |
31 #include <string.h> | |
32 #include <inttypes.h> | |
33 | |
29 #include "hsdis.h" | 34 #include "hsdis.h" |
30 | 35 |
31 #include "stdio.h" | |
32 #include "stdlib.h" | |
33 #include "string.h" | |
34 | 36 |
35 void greet(const char*); | 37 void greet(const char*); |
36 void disassemble(void*, void*); | 38 void disassemble(uintptr_t, uintptr_t); |
37 void end_of_file(); | 39 void end_of_file(); |
38 | 40 |
39 const char* options = NULL; | 41 const char* options = NULL; |
40 int raw = 0; | 42 int raw = 0; |
41 int xml = 0; | 43 int xml = 0; |
60 greeted = 1; | 62 greeted = 1; |
61 } | 63 } |
62 if (!greeted) | 64 if (!greeted) |
63 greet("world"); | 65 greet("world"); |
64 printf("...And now for something completely different:\n"); | 66 printf("...And now for something completely different:\n"); |
65 disassemble((void*) &main, (void*) &end_of_file); | 67 void *start = (void*) &main; |
68 void *end = (void*) &end_of_file; | |
69 #if defined(__ia64) || defined(__powerpc__) | |
70 /* On IA64 and PPC function pointers are pointers to function descriptors */ | |
71 start = *((void**)start); | |
72 end = *((void**)end); | |
73 #endif | |
74 disassemble(start, (end > start) ? end : start + 64); | |
66 printf("Cheers!\n"); | 75 printf("Cheers!\n"); |
67 } | 76 } |
68 | 77 |
69 void greet(const char* whom) { | 78 void greet(const char* whom) { |
70 printf("Hello, %s!\n", whom); | 79 printf("Hello, %s!\n", whom); |
74 | 83 |
75 /* don't disassemble after this point... */ | 84 /* don't disassemble after this point... */ |
76 | 85 |
77 #include "dlfcn.h" | 86 #include "dlfcn.h" |
78 | 87 |
79 #define DECODE_INSTRUCTIONS_NAME "decode_instructions" | 88 #define DECODE_INSTRUCTIONS_NAME "decode_instructions_virtual" |
80 #define HSDIS_NAME "hsdis" | 89 #define HSDIS_NAME "hsdis" |
81 static void* decode_instructions_pv = 0; | 90 static void* decode_instructions_pv = 0; |
82 static const char* hsdis_path[] = { | 91 static const char* hsdis_path[] = { |
83 HSDIS_NAME"-"LIBARCH LIB_EXT, | 92 HSDIS_NAME"-"LIBARCH LIB_EXT, |
84 "./" HSDIS_NAME"-"LIBARCH LIB_EXT, | 93 "./" HSDIS_NAME"-"LIBARCH LIB_EXT, |
106 } | 115 } |
107 } | 116 } |
108 | 117 |
109 | 118 |
110 static const char* lookup(void* addr) { | 119 static const char* lookup(void* addr) { |
120 #if defined(__ia64) || defined(__powerpc__) | |
121 /* On IA64 and PPC function pointers are pointers to function descriptors */ | |
122 #define CHECK_NAME(fn) \ | |
123 if (addr == *((void**) &fn)) return #fn; | |
124 #else | |
111 #define CHECK_NAME(fn) \ | 125 #define CHECK_NAME(fn) \ |
112 if (addr == (void*) &fn) return #fn; | 126 if (addr == (void*) &fn) return #fn; |
127 #endif | |
113 | 128 |
114 CHECK_NAME(main); | 129 CHECK_NAME(main); |
115 CHECK_NAME(greet); | 130 CHECK_NAME(greet); |
116 return NULL; | 131 return NULL; |
117 } | 132 } |
121 (!strncmp(event, tag, sizeof(tag)-1) && \ | 136 (!strncmp(event, tag, sizeof(tag)-1) && \ |
122 (!event[sizeof(tag)-1] || strchr(" /", event[sizeof(tag)-1]))) | 137 (!event[sizeof(tag)-1] || strchr(" /", event[sizeof(tag)-1]))) |
123 | 138 |
124 | 139 |
125 static const char event_cookie[] = "event_cookie"; /* demo placeholder */ | 140 static const char event_cookie[] = "event_cookie"; /* demo placeholder */ |
141 static void* simple_handle_event(void* cookie, const char* event, void* arg) { | |
142 if (MATCH(event, "/insn")) { | |
143 // follow each complete insn by a nice newline | |
144 printf("\n"); | |
145 } | |
146 return NULL; | |
147 } | |
148 | |
126 static void* handle_event(void* cookie, const char* event, void* arg) { | 149 static void* handle_event(void* cookie, const char* event, void* arg) { |
127 #define NS_DEMO "demo:" | 150 #define NS_DEMO "demo:" |
128 if (cookie != event_cookie) | 151 if (cookie != event_cookie) |
129 printf("*** bad event cookie %p != %p\n", cookie, event_cookie); | 152 printf("*** bad event cookie %p != %p\n", cookie, event_cookie); |
130 | 153 |
160 | 183 |
161 /* basic action for <insn>: */ | 184 /* basic action for <insn>: */ |
162 printf(" %p\t", arg); | 185 printf(" %p\t", arg); |
163 | 186 |
164 } else if (MATCH(event, "/insn")) { | 187 } else if (MATCH(event, "/insn")) { |
165 /* basic action for </insn>: | 188 // follow each complete insn by a nice newline |
166 (none, plugin puts the newline for us | 189 printf("\n"); |
167 */ | |
168 | |
169 } else if (MATCH(event, "mach")) { | 190 } else if (MATCH(event, "mach")) { |
170 printf("Decoding for CPU '%s'\n", (char*) arg); | 191 printf("Decoding for CPU '%s'\n", (char*) arg); |
171 | 192 |
172 } else if (MATCH(event, "addr")) { | 193 } else if (MATCH(event, "addr")) { |
173 /* basic action for <addr/>: */ | 194 /* basic action for <addr/>: */ |
184 } | 205 } |
185 | 206 |
186 #define fprintf_callback \ | 207 #define fprintf_callback \ |
187 (decode_instructions_printf_callback_ftype)&fprintf | 208 (decode_instructions_printf_callback_ftype)&fprintf |
188 | 209 |
189 void disassemble(void* from, void* to) { | 210 void disassemble(uintptr_t from, uintptr_t to) { |
190 const char* err = load_decode_instructions(); | 211 const char* err = load_decode_instructions(); |
191 if (err != NULL) { | 212 if (err != NULL) { |
192 printf("%s: %s\n", err, dlerror()); | 213 printf("%s: %s\n", err, dlerror()); |
193 exit(1); | 214 exit(1); |
194 } | 215 } |
195 printf("Decoding from %p to %p...\n", from, to); | 216 printf("Decoding from %p to %p...\n", from, to); |
196 decode_instructions_ftype decode_instructions | 217 decode_instructions_ftype decode_instructions |
197 = (decode_instructions_ftype) decode_instructions_pv; | 218 = (decode_instructions_ftype) decode_instructions_pv; |
198 void* res; | 219 void* res; |
199 if (raw && xml) { | 220 if (raw && xml) { |
200 res = (*decode_instructions)(from, to, NULL, stdout, NULL, stdout, options); | 221 res = (*decode_instructions)(from, to, (unsigned char*)from, to - from, simple_handle_event, stdout, NULL, stdout, options); |
201 } else if (raw) { | 222 } else if (raw) { |
202 res = (*decode_instructions)(from, to, NULL, NULL, NULL, stdout, options); | 223 res = (*decode_instructions)(from, to, (unsigned char*)from, to - from, simple_handle_event, stdout, NULL, stdout, options); |
203 } else { | 224 } else { |
204 res = (*decode_instructions)(from, to, | 225 res = (*decode_instructions)(from, to, (unsigned char*)from, to - from, |
205 handle_event, (void*) event_cookie, | 226 handle_event, (void*) event_cookie, |
206 fprintf_callback, stdout, | 227 fprintf_callback, stdout, |
207 options); | 228 options); |
208 } | 229 } |
209 if (res != to) | 230 if (res != (void*)to) |
210 printf("*** Result was %p!\n", res); | 231 printf("*** Result was %p!\n", res); |
211 } | 232 } |