annotate agent/src/share/native/sadis.c @ 10074:e8fbc5fd3440

aot: add/fix some javadoc
author Bernhard Urban <bernhard.urban@jku.at>
date Mon, 17 Jun 2013 17:50:09 +0200
parents 39432a1cefdd
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
1 /*
8750
39432a1cefdd 8003348: SA can not read core file on OS
minqi
parents: 7440
diff changeset
2 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
4 *
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
7 * published by the Free Software Foundation.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
8 *
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
13 * accompanied this code).
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
14 *
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
18 *
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
21 * questions.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
22 *
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
23 */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
24
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
25 #include "sun_jvm_hotspot_asm_Disassembler.h"
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
26
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
27 /*
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
28 * This file implements a binding between Java and the hsdis
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
29 * dissasembler. It should compile on Linux/Solaris and Windows.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
30 * The only platform dependent pieces of the code for doing
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
31 * dlopen/dlsym to find the entry point in hsdis. All the rest is
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
32 * standard JNI code.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
33 */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
34
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
35 #ifdef _WINDOWS
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
36
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
37 #define snprintf _snprintf
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
38 #define vsnprintf _vsnprintf
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
39
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
40 #include <windows.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
41 #include <sys/types.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
42 #include <sys/stat.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
43 #ifdef _DEBUG
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
44 #include <crtdbg.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
45 #endif
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
46
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
47 #else
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
48
6838
7a40901e0d5c 8000332: SA ClassDump throws exception after permgen removal
minqi
parents: 6782
diff changeset
49 #include <string.h>
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
50 #include <dlfcn.h>
8750
39432a1cefdd 8003348: SA can not read core file on OS
minqi
parents: 7440
diff changeset
51
39432a1cefdd 8003348: SA can not read core file on OS
minqi
parents: 7440
diff changeset
52 #ifndef __APPLE__
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
53 #include <link.h>
8750
39432a1cefdd 8003348: SA can not read core file on OS
minqi
parents: 7440
diff changeset
54 #endif
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
55
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
56 #endif
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
57
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
58 #include <limits.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
59 #include <stdio.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
60 #include <stdarg.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
61 #include <stdlib.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
62 #include <errno.h>
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
63
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
64 #ifdef _WINDOWS
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
65 static int getLastErrorString(char *buf, size_t len)
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
66 {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
67 long errval;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
68
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
69 if ((errval = GetLastError()) != 0)
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
70 {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
71 /* DOS error */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
72 size_t n = (size_t)FormatMessage(
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
73 FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
74 NULL,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
75 errval,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
76 0,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
77 buf,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
78 (DWORD)len,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
79 NULL);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
80 if (n > 3) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
81 /* Drop final '.', CR, LF */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
82 if (buf[n - 1] == '\n') n--;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
83 if (buf[n - 1] == '\r') n--;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
84 if (buf[n - 1] == '.') n--;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
85 buf[n] = '\0';
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
86 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
87 return (int)n;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
88 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
89
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
90 if (errno != 0)
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
91 {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
92 /* C runtime error that has no corresponding DOS error code */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
93 const char *s = strerror(errno);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
94 size_t n = strlen(s);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
95 if (n >= len) n = len - 1;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
96 strncpy(buf, s, n);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
97 buf[n] = '\0';
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
98 return (int)n;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
99 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
100 return 0;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
101 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
102 #endif /* _WINDOWS */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
103
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
104 /*
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
105 * Class: sun_jvm_hotspot_asm_Disassembler
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
106 * Method: load_library
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
107 * Signature: (Ljava/lang/String;)L
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
108 */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
109 JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_asm_Disassembler_load_1library(JNIEnv * env,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
110 jclass disclass,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
111 jstring jrepath_s,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
112 jstring libname_s) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
113 uintptr_t func = 0;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
114 const char* error_message = NULL;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
115 jboolean isCopy;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
116
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
117 const char * jrepath = (*env)->GetStringUTFChars(env, jrepath_s, &isCopy); // like $JAVA_HOME/jre/lib/sparc/
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
118 const char * libname = (*env)->GetStringUTFChars(env, libname_s, &isCopy);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
119 char buffer[128];
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
120
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
121 /* Load the hsdis library */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
122 #ifdef _WINDOWS
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
123 HINSTANCE hsdis_handle;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
124 hsdis_handle = LoadLibrary(libname);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
125 if (hsdis_handle == NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
126 snprintf(buffer, sizeof(buffer), "%s%s", jrepath, libname);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
127 hsdis_handle = LoadLibrary(buffer);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
128 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
129 if (hsdis_handle != NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
130 func = (uintptr_t)GetProcAddress(hsdis_handle, "decode_instructions_virtual");
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
131 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
132 if (func == 0) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
133 getLastErrorString(buffer, sizeof(buffer));
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
134 error_message = buffer;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
135 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
136 #else
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
137 void* hsdis_handle;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
138 hsdis_handle = dlopen(libname, RTLD_LAZY | RTLD_GLOBAL);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
139 if (hsdis_handle == NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
140 snprintf(buffer, sizeof(buffer), "%s%s", jrepath, libname);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
141 hsdis_handle = dlopen(buffer, RTLD_LAZY | RTLD_GLOBAL);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
142 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
143 if (hsdis_handle != NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
144 func = (uintptr_t)dlsym(hsdis_handle, "decode_instructions_virtual");
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
145 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
146 if (func == 0) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
147 error_message = dlerror();
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
148 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
149 #endif
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
150
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
151 (*env)->ReleaseStringUTFChars(env, libname_s, libname);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
152 (*env)->ReleaseStringUTFChars(env, jrepath_s, jrepath);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
153
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
154 if (func == 0) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
155 /* Couldn't find entry point. error_message should contain some
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
156 * platform dependent error message.
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
157 */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
158 jclass eclass = (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException");
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
159 (*env)->ThrowNew(env, eclass, error_message);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
160 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
161 return (jlong)func;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
162 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
163
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
164 /* signature of decode_instructions_virtual from hsdis.h */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
165 typedef void* (*decode_func)(uintptr_t start_va, uintptr_t end_va,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
166 unsigned char* start, uintptr_t length,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
167 void* (*event_callback)(void*, const char*, void*),
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
168 void* event_stream,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
169 int (*printf_callback)(void*, const char*, ...),
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
170 void* printf_stream,
8750
39432a1cefdd 8003348: SA can not read core file on OS
minqi
parents: 7440
diff changeset
171 const char* options,
39432a1cefdd 8003348: SA can not read core file on OS
minqi
parents: 7440
diff changeset
172 int newline);
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
173
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
174 /* container for call back state when decoding instructions */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
175 typedef struct {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
176 JNIEnv* env;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
177 jobject dis;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
178 jobject visitor;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
179 jmethodID handle_event;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
180 jmethodID raw_print;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
181 char buffer[4096];
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
182 } decode_env;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
183
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
184
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
185 /* event callback binding to Disassembler.handleEvent */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
186 static void* event_to_env(void* env_pv, const char* event, void* arg) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
187 decode_env* denv = (decode_env*)env_pv;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
188 JNIEnv* env = denv->env;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
189 jstring event_string = (*env)->NewStringUTF(env, event);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
190 jlong result = (*env)->CallLongMethod(env, denv->dis, denv->handle_event, denv->visitor,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
191 event_string, (jlong) (uintptr_t)arg);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
192 if ((*env)->ExceptionOccurred(env) != NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
193 /* ignore exceptions for now */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
194 (*env)->ExceptionClear(env);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
195 result = 0;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
196 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
197 return (void*)(uintptr_t)result;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
198 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
199
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
200 /* printing callback binding to Disassembler.rawPrint */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
201 static int printf_to_env(void* env_pv, const char* format, ...) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
202 jstring output;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
203 va_list ap;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
204 int cnt;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
205 decode_env* denv = (decode_env*)env_pv;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
206 JNIEnv* env = denv->env;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
207 size_t flen = strlen(format);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
208 const char* raw = NULL;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
209
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
210 if (flen == 0) return 0;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
211 if (flen < 2 ||
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
212 strchr(format, '%') == NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
213 raw = format;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
214 } else if (format[0] == '%' && format[1] == '%' &&
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
215 strchr(format+2, '%') == NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
216 // happens a lot on machines with names like %foo
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
217 flen--;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
218 raw = format+1;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
219 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
220 if (raw != NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
221 jstring output = (*env)->NewStringUTF(env, raw);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
222 (*env)->CallVoidMethod(env, denv->dis, denv->raw_print, denv->visitor, output);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
223 if ((*env)->ExceptionOccurred(env) != NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
224 /* ignore exceptions for now */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
225 (*env)->ExceptionClear(env);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
226 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
227 return (int) flen;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
228 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
229 va_start(ap, format);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
230 cnt = vsnprintf(denv->buffer, sizeof(denv->buffer), format, ap);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
231 va_end(ap);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
232
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
233 output = (*env)->NewStringUTF(env, denv->buffer);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
234 (*env)->CallVoidMethod(env, denv->dis, denv->raw_print, denv->visitor, output);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
235 if ((*env)->ExceptionOccurred(env) != NULL) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
236 /* ignore exceptions for now */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
237 (*env)->ExceptionClear(env);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
238 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
239 return cnt;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
240 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
241
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
242 /*
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
243 * Class: sun_jvm_hotspot_asm_Disassembler
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
244 * Method: decode
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
245 * Signature: (Lsun/jvm/hotspot/asm/InstructionVisitor;J[BLjava/lang/String;J)V
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
246 */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
247 JNIEXPORT void JNICALL Java_sun_jvm_hotspot_asm_Disassembler_decode(JNIEnv * env,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
248 jobject dis,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
249 jobject visitor,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
250 jlong startPc,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
251 jbyteArray code,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
252 jstring options_s,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
253 jlong decode_instructions_virtual) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
254 jboolean isCopy;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
255 jbyte* start = (*env)->GetByteArrayElements(env, code, &isCopy);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
256 jbyte* end = start + (*env)->GetArrayLength(env, code);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
257 const char * options = (*env)->GetStringUTFChars(env, options_s, &isCopy);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
258 jclass disclass = (*env)->GetObjectClass(env, dis);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
259
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
260 decode_env denv;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
261 denv.env = env;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
262 denv.dis = dis;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
263 denv.visitor = visitor;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
264
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
265 /* find Disassembler.handleEvent callback */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
266 denv.handle_event = (*env)->GetMethodID(env, disclass, "handleEvent",
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
267 "(Lsun/jvm/hotspot/asm/InstructionVisitor;Ljava/lang/String;J)J");
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
268 if ((*env)->ExceptionOccurred(env)) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
269 return;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
270 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
271
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
272 /* find Disassembler.rawPrint callback */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
273 denv.raw_print = (*env)->GetMethodID(env, disclass, "rawPrint",
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
274 "(Lsun/jvm/hotspot/asm/InstructionVisitor;Ljava/lang/String;)V");
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
275 if ((*env)->ExceptionOccurred(env)) {
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
276 return;
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
277 }
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
278
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
279 /* decode the buffer */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
280 (*(decode_func)(uintptr_t)decode_instructions_virtual)(startPc,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
281 startPc + end - start,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
282 (unsigned char*)start,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
283 end - start,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
284 &event_to_env, (void*) &denv,
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
285 &printf_to_env, (void*) &denv,
8750
39432a1cefdd 8003348: SA can not read core file on OS
minqi
parents: 7440
diff changeset
286 options, 0 /* newline */);
6782
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
287
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
288 /* cleanup */
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
289 (*env)->ReleaseByteArrayElements(env, code, start, JNI_ABORT);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
290 (*env)->ReleaseStringUTFChars(env, options_s, options);
5a98bf7d847b 6879063: SA should use hsdis for disassembly
minqi
parents:
diff changeset
291 }