blob: ab15c816ea3dd7d2dde29552aa59a57424472b1f [file] [log] [blame]
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Andy McFadden3a1aedb2009-05-07 13:30:23 -070016
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080017/*
18 * Dalvik instruction utility functions.
Dan Bornstein84244322010-11-17 12:05:04 -080019 *
20 * IMPORTANT NOTE: Much of the contents of this file are generated
21 * automatically by the opcode-gen tool. Any edits to the generated
22 * sections will get wiped out the next time the tool is run.
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080023 */
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080024
Dan Bornstein84244322010-11-17 12:05:04 -080025#include "InstrUtils.h"
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080026#include <stdlib.h>
27
Dan Bornstein84244322010-11-17 12:05:04 -080028#if 0
29/* coming soon! */
30
31/*
32 * Table that maps each opcode to the full width of instructions that
33 * use that opcode, in (16-bit) code units. Unimplemented opcodes as
34 * well as the "breakpoint" opcode have a width of zero.
35 */
36static InstructionWidth gOpcodeWidthTable[kNumDalvikInstructions] = {
37 // BEGIN(libdex-widths); GENERATED AUTOMATICALLY BY opcode-gen
38 1, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 1, 1, 1, 1,
39 1, 1, 1, 2, 3, 2, 2, 3, 5, 2, 2, 3, 2, 1, 1, 2,
40 2, 1, 2, 2, 3, 3, 3, 1, 1, 2, 3, 3, 3, 2, 2, 2,
41 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
42 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
43 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
44 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3,
45 3, 3, 3, 0, 3, 3, 3, 3, 3, 0, 0, 1, 1, 1, 1, 1,
46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
47 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
48 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
49 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
50 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
51 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
52 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 3, 3,
53 3, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 0,
54 // END(libdex-widths)
55};
56
57/*
58 * Table that maps each opcode to the flags associated with that
59 * opcode.
60 */
61static InstructionFlags gOpcodeFlagsTable[kNumDalvikInstructions] = {
62 // BEGIN(libdex-flags); GENERATED AUTOMATICALLY BY opcode-gen
63 kInstrCanContinue,
64 kInstrCanContinue,
65 kInstrCanContinue,
66 kInstrCanContinue,
67 kInstrCanContinue,
68 kInstrCanContinue,
69 kInstrCanContinue,
70 kInstrCanContinue,
71 kInstrCanContinue,
72 kInstrCanContinue,
73 kInstrCanContinue,
74 kInstrCanContinue,
75 kInstrCanContinue,
76 kInstrCanContinue,
77 kInstrCanReturn,
78 kInstrCanReturn,
79 kInstrCanReturn,
80 kInstrCanReturn,
81 kInstrCanContinue,
82 kInstrCanContinue,
83 kInstrCanContinue,
84 kInstrCanContinue,
85 kInstrCanContinue,
86 kInstrCanContinue,
87 kInstrCanContinue,
88 kInstrCanContinue,
89 kInstrCanContinue|kInstrCanThrow,
90 kInstrCanContinue|kInstrCanThrow,
91 kInstrCanContinue|kInstrCanThrow,
92 kInstrCanContinue|kInstrCanThrow,
93 kInstrCanContinue|kInstrCanThrow,
94 kInstrCanContinue|kInstrCanThrow,
95 kInstrCanContinue|kInstrCanThrow,
96 kInstrCanContinue|kInstrCanThrow,
97 kInstrCanContinue|kInstrCanThrow,
98 kInstrCanContinue|kInstrCanThrow,
99 kInstrCanContinue|kInstrCanThrow,
100 kInstrCanContinue|kInstrCanThrow,
101 kInstrCanContinue,
102 kInstrCanThrow,
103 kInstrCanBranch,
104 kInstrCanBranch,
105 kInstrCanBranch,
106 kInstrCanContinue|kInstrCanSwitch,
107 kInstrCanContinue|kInstrCanSwitch,
108 kInstrCanContinue,
109 kInstrCanContinue,
110 kInstrCanContinue,
111 kInstrCanContinue,
112 kInstrCanContinue,
113 kInstrCanContinue|kInstrCanBranch,
114 kInstrCanContinue|kInstrCanBranch,
115 kInstrCanContinue|kInstrCanBranch,
116 kInstrCanContinue|kInstrCanBranch,
117 kInstrCanContinue|kInstrCanBranch,
118 kInstrCanContinue|kInstrCanBranch,
119 kInstrCanContinue|kInstrCanBranch,
120 kInstrCanContinue|kInstrCanBranch,
121 kInstrCanContinue|kInstrCanBranch,
122 kInstrCanContinue|kInstrCanBranch,
123 kInstrCanContinue|kInstrCanBranch,
124 kInstrCanContinue|kInstrCanBranch,
125 0,
126 0,
127 0,
128 0,
129 0,
130 0,
131 kInstrCanContinue|kInstrCanThrow,
132 kInstrCanContinue|kInstrCanThrow,
133 kInstrCanContinue|kInstrCanThrow,
134 kInstrCanContinue|kInstrCanThrow,
135 kInstrCanContinue|kInstrCanThrow,
136 kInstrCanContinue|kInstrCanThrow,
137 kInstrCanContinue|kInstrCanThrow,
138 kInstrCanContinue|kInstrCanThrow,
139 kInstrCanContinue|kInstrCanThrow,
140 kInstrCanContinue|kInstrCanThrow,
141 kInstrCanContinue|kInstrCanThrow,
142 kInstrCanContinue|kInstrCanThrow,
143 kInstrCanContinue|kInstrCanThrow,
144 kInstrCanContinue|kInstrCanThrow,
145 kInstrCanContinue|kInstrCanThrow,
146 kInstrCanContinue|kInstrCanThrow,
147 kInstrCanContinue|kInstrCanThrow,
148 kInstrCanContinue|kInstrCanThrow,
149 kInstrCanContinue|kInstrCanThrow,
150 kInstrCanContinue|kInstrCanThrow,
151 kInstrCanContinue|kInstrCanThrow,
152 kInstrCanContinue|kInstrCanThrow,
153 kInstrCanContinue|kInstrCanThrow,
154 kInstrCanContinue|kInstrCanThrow,
155 kInstrCanContinue|kInstrCanThrow,
156 kInstrCanContinue|kInstrCanThrow,
157 kInstrCanContinue|kInstrCanThrow,
158 kInstrCanContinue|kInstrCanThrow,
159 kInstrCanContinue|kInstrCanThrow,
160 kInstrCanContinue|kInstrCanThrow,
161 kInstrCanContinue|kInstrCanThrow,
162 kInstrCanContinue|kInstrCanThrow,
163 kInstrCanContinue|kInstrCanThrow,
164 kInstrCanContinue|kInstrCanThrow,
165 kInstrCanContinue|kInstrCanThrow,
166 kInstrCanContinue|kInstrCanThrow,
167 kInstrCanContinue|kInstrCanThrow,
168 kInstrCanContinue|kInstrCanThrow,
169 kInstrCanContinue|kInstrCanThrow,
170 kInstrCanContinue|kInstrCanThrow,
171 kInstrCanContinue|kInstrCanThrow,
172 kInstrCanContinue|kInstrCanThrow,
173 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
174 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
175 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
176 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
177 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
178 0,
179 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
180 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
181 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
182 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
183 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
184 0,
185 0,
186 kInstrCanContinue,
187 kInstrCanContinue,
188 kInstrCanContinue,
189 kInstrCanContinue,
190 kInstrCanContinue,
191 kInstrCanContinue,
192 kInstrCanContinue,
193 kInstrCanContinue,
194 kInstrCanContinue,
195 kInstrCanContinue,
196 kInstrCanContinue,
197 kInstrCanContinue,
198 kInstrCanContinue,
199 kInstrCanContinue,
200 kInstrCanContinue,
201 kInstrCanContinue,
202 kInstrCanContinue,
203 kInstrCanContinue,
204 kInstrCanContinue,
205 kInstrCanContinue,
206 kInstrCanContinue,
207 kInstrCanContinue,
208 kInstrCanContinue,
209 kInstrCanContinue,
210 kInstrCanContinue|kInstrCanThrow,
211 kInstrCanContinue|kInstrCanThrow,
212 kInstrCanContinue,
213 kInstrCanContinue,
214 kInstrCanContinue,
215 kInstrCanContinue,
216 kInstrCanContinue,
217 kInstrCanContinue,
218 kInstrCanContinue,
219 kInstrCanContinue,
220 kInstrCanContinue,
221 kInstrCanContinue|kInstrCanThrow,
222 kInstrCanContinue|kInstrCanThrow,
223 kInstrCanContinue,
224 kInstrCanContinue,
225 kInstrCanContinue,
226 kInstrCanContinue,
227 kInstrCanContinue,
228 kInstrCanContinue,
229 kInstrCanContinue,
230 kInstrCanContinue,
231 kInstrCanContinue,
232 kInstrCanContinue,
233 kInstrCanContinue,
234 kInstrCanContinue,
235 kInstrCanContinue,
236 kInstrCanContinue,
237 kInstrCanContinue,
238 kInstrCanContinue,
239 kInstrCanContinue,
240 kInstrCanContinue,
241 kInstrCanContinue,
242 kInstrCanContinue|kInstrCanThrow,
243 kInstrCanContinue|kInstrCanThrow,
244 kInstrCanContinue,
245 kInstrCanContinue,
246 kInstrCanContinue,
247 kInstrCanContinue,
248 kInstrCanContinue,
249 kInstrCanContinue,
250 kInstrCanContinue,
251 kInstrCanContinue,
252 kInstrCanContinue,
253 kInstrCanContinue|kInstrCanThrow,
254 kInstrCanContinue|kInstrCanThrow,
255 kInstrCanContinue,
256 kInstrCanContinue,
257 kInstrCanContinue,
258 kInstrCanContinue,
259 kInstrCanContinue,
260 kInstrCanContinue,
261 kInstrCanContinue,
262 kInstrCanContinue,
263 kInstrCanContinue,
264 kInstrCanContinue,
265 kInstrCanContinue,
266 kInstrCanContinue,
267 kInstrCanContinue,
268 kInstrCanContinue,
269 kInstrCanContinue,
270 kInstrCanContinue,
271 kInstrCanContinue,
272 kInstrCanContinue,
273 kInstrCanContinue,
274 kInstrCanContinue|kInstrCanThrow,
275 kInstrCanContinue|kInstrCanThrow,
276 kInstrCanContinue,
277 kInstrCanContinue,
278 kInstrCanContinue,
279 kInstrCanContinue,
280 kInstrCanContinue,
281 kInstrCanContinue,
282 kInstrCanContinue|kInstrCanThrow,
283 kInstrCanContinue|kInstrCanThrow,
284 kInstrCanContinue,
285 kInstrCanContinue,
286 kInstrCanContinue,
287 kInstrCanContinue,
288 kInstrCanContinue,
289 kInstrCanContinue,
290 kInstrCanContinue|kInstrCanThrow,
291 kInstrCanContinue|kInstrCanThrow,
292 kInstrCanContinue|kInstrCanThrow,
293 kInstrCanContinue|kInstrCanThrow,
294 kInstrCanContinue|kInstrCanThrow,
295 kInstrCanContinue|kInstrCanThrow,
296 kInstrCanContinue|kInstrCanThrow,
297 kInstrCanContinue|kInstrCanThrow,
298 kInstrCanContinue|kInstrCanThrow,
299 0,
300 kInstrCanThrow,
301 kInstrCanContinue|kInstrCanThrow,
302 kInstrCanContinue|kInstrCanThrow,
303 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
304 kInstrCanReturn,
305 kInstrCanContinue|kInstrCanThrow,
306 kInstrCanContinue|kInstrCanThrow,
307 kInstrCanContinue|kInstrCanThrow,
308 kInstrCanContinue|kInstrCanThrow,
309 kInstrCanContinue|kInstrCanThrow,
310 kInstrCanContinue|kInstrCanThrow,
311 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
312 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
313 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
314 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
315 kInstrCanContinue|kInstrCanThrow,
316 kInstrCanContinue|kInstrCanThrow,
317 kInstrCanContinue|kInstrCanThrow,
318 0,
319 // END(libdex-flags)
320};
321
322/*
323 * Table that maps each opcode to the instruction format associated
324 * that opcode.
325 */
326static InstructionFormat gOpcodeFormatTable[kNumDalvikInstructions] = {
327 // BEGIN(libdex-formats); GENERATED AUTOMATICALLY BY opcode-gen
328 kFmt10x, kFmt12x, kFmt22x, kFmt32x, kFmt12x, kFmt22x, kFmt32x,
329 kFmt12x, kFmt22x, kFmt32x, kFmt11x, kFmt11x, kFmt11x, kFmt11x,
330 kFmt10x, kFmt11x, kFmt11x, kFmt11x, kFmt11n, kFmt21s, kFmt31i,
331 kFmt21h, kFmt21s, kFmt31i, kFmt51l, kFmt21h, kFmt21c, kFmt31c,
332 kFmt21c, kFmt11x, kFmt11x, kFmt21c, kFmt22c, kFmt12x, kFmt21c,
333 kFmt22c, kFmt35c, kFmt3rc, kFmt31t, kFmt11x, kFmt10t, kFmt20t,
334 kFmt30t, kFmt31t, kFmt31t, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
335 kFmt23x, kFmt22t, kFmt22t, kFmt22t, kFmt22t, kFmt22t, kFmt22t,
336 kFmt21t, kFmt21t, kFmt21t, kFmt21t, kFmt21t, kFmt21t, kFmt00x,
337 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt23x, kFmt23x,
338 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
339 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt22c, kFmt22c,
340 kFmt22c, kFmt22c, kFmt22c, kFmt22c, kFmt22c, kFmt22c, kFmt22c,
341 kFmt22c, kFmt22c, kFmt22c, kFmt22c, kFmt22c, kFmt21c, kFmt21c,
342 kFmt21c, kFmt21c, kFmt21c, kFmt21c, kFmt21c, kFmt21c, kFmt21c,
343 kFmt21c, kFmt21c, kFmt21c, kFmt21c, kFmt21c, kFmt35c, kFmt35c,
344 kFmt35c, kFmt35c, kFmt35c, kFmt00x, kFmt3rc, kFmt3rc, kFmt3rc,
345 kFmt3rc, kFmt3rc, kFmt00x, kFmt00x, kFmt12x, kFmt12x, kFmt12x,
346 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
347 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
348 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt23x, kFmt23x, kFmt23x,
349 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
350 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
351 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
352 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
353 kFmt23x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
354 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
355 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
356 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
357 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt22s, kFmt22s,
358 kFmt22s, kFmt22s, kFmt22s, kFmt22s, kFmt22s, kFmt22s, kFmt22b,
359 kFmt22b, kFmt22b, kFmt22b, kFmt22b, kFmt22b, kFmt22b, kFmt22b,
360 kFmt22b, kFmt22b, kFmt22b, kFmt22c, kFmt22c, kFmt21c, kFmt21c,
361 kFmt22c, kFmt22c, kFmt22c, kFmt21c, kFmt21c, kFmt00x, kFmt20bc,
362 kFmt35mi, kFmt3rmi, kFmt35c, kFmt10x, kFmt22cs, kFmt22cs, kFmt22cs,
363 kFmt22cs, kFmt22cs, kFmt22cs, kFmt35ms, kFmt3rms, kFmt35ms, kFmt3rms,
364 kFmt22c, kFmt21c, kFmt21c, kFmt00x,
365 // END(libdex-formats)
366};
367
368/*
369 * Table that maps each opcode to the index type implied by that
370 * opcode.
371 */
372static InstructionIndexType gOpcodeIndexTypeTable[kNumDalvikInstructions] = {
373 // BEGIN(libdex-index-types); GENERATED AUTOMATICALLY BY opcode-gen
374 kIndexNone, kIndexNone, kIndexNone,
375 kIndexNone, kIndexNone, kIndexNone,
376 kIndexNone, kIndexNone, kIndexNone,
377 kIndexNone, kIndexNone, kIndexNone,
378 kIndexNone, kIndexNone, kIndexNone,
379 kIndexNone, kIndexNone, kIndexNone,
380 kIndexNone, kIndexNone, kIndexNone,
381 kIndexNone, kIndexNone, kIndexNone,
382 kIndexNone, kIndexNone, kIndexStringRef,
383 kIndexStringRef, kIndexTypeRef, kIndexNone,
384 kIndexNone, kIndexTypeRef, kIndexTypeRef,
385 kIndexNone, kIndexTypeRef, kIndexTypeRef,
386 kIndexTypeRef, kIndexTypeRef, kIndexNone,
387 kIndexNone, kIndexNone, kIndexNone,
388 kIndexNone, kIndexNone, kIndexNone,
389 kIndexNone, kIndexNone, kIndexNone,
390 kIndexNone, kIndexNone, kIndexNone,
391 kIndexNone, kIndexNone, kIndexNone,
392 kIndexNone, kIndexNone, kIndexNone,
393 kIndexNone, kIndexNone, kIndexNone,
394 kIndexNone, kIndexNone, kIndexUnknown,
395 kIndexUnknown, kIndexUnknown, kIndexUnknown,
396 kIndexUnknown, kIndexUnknown, kIndexNone,
397 kIndexNone, kIndexNone, kIndexNone,
398 kIndexNone, kIndexNone, kIndexNone,
399 kIndexNone, kIndexNone, kIndexNone,
400 kIndexNone, kIndexNone, kIndexNone,
401 kIndexNone, kIndexFieldRef, kIndexFieldRef,
402 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
403 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
404 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
405 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
406 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
407 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
408 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
409 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
410 kIndexFieldRef, kIndexFieldRef, kIndexMethodRef,
411 kIndexMethodRef, kIndexMethodRef, kIndexMethodRef,
412 kIndexMethodRef, kIndexUnknown, kIndexMethodRef,
413 kIndexMethodRef, kIndexMethodRef, kIndexMethodRef,
414 kIndexMethodRef, kIndexUnknown, kIndexUnknown,
415 kIndexNone, kIndexNone, kIndexNone,
416 kIndexNone, kIndexNone, kIndexNone,
417 kIndexNone, kIndexNone, kIndexNone,
418 kIndexNone, kIndexNone, kIndexNone,
419 kIndexNone, kIndexNone, kIndexNone,
420 kIndexNone, kIndexNone, kIndexNone,
421 kIndexNone, kIndexNone, kIndexNone,
422 kIndexNone, kIndexNone, kIndexNone,
423 kIndexNone, kIndexNone, kIndexNone,
424 kIndexNone, kIndexNone, kIndexNone,
425 kIndexNone, kIndexNone, kIndexNone,
426 kIndexNone, kIndexNone, kIndexNone,
427 kIndexNone, kIndexNone, kIndexNone,
428 kIndexNone, kIndexNone, kIndexNone,
429 kIndexNone, kIndexNone, kIndexNone,
430 kIndexNone, kIndexNone, kIndexNone,
431 kIndexNone, kIndexNone, kIndexNone,
432 kIndexNone, kIndexNone, kIndexNone,
433 kIndexNone, kIndexNone, kIndexNone,
434 kIndexNone, kIndexNone, kIndexNone,
435 kIndexNone, kIndexNone, kIndexNone,
436 kIndexNone, kIndexNone, kIndexNone,
437 kIndexNone, kIndexNone, kIndexNone,
438 kIndexNone, kIndexNone, kIndexNone,
439 kIndexNone, kIndexNone, kIndexNone,
440 kIndexNone, kIndexNone, kIndexNone,
441 kIndexNone, kIndexNone, kIndexNone,
442 kIndexNone, kIndexNone, kIndexNone,
443 kIndexNone, kIndexNone, kIndexNone,
444 kIndexNone, kIndexNone, kIndexNone,
445 kIndexNone, kIndexNone, kIndexNone,
446 kIndexNone, kIndexNone, kIndexNone,
447 kIndexNone, kIndexNone, kIndexNone,
448 kIndexNone, kIndexNone, kIndexNone,
449 kIndexNone, kIndexNone, kIndexFieldRef,
450 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
451 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
452 kIndexFieldRef, kIndexFieldRef, kIndexUnknown,
453 kIndexVaries, kIndexInlineMethod, kIndexInlineMethod,
454 kIndexMethodRef, kIndexNone, kIndexFieldOffset,
455 kIndexFieldOffset, kIndexFieldOffset, kIndexFieldOffset,
456 kIndexFieldOffset, kIndexFieldOffset, kIndexVtableOffset,
457 kIndexVtableOffset, kIndexVtableOffset, kIndexVtableOffset,
458 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
459 kIndexUnknown,
460 // END(libdex-index-types)
461};
462#endif
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800463
464/*
465 * Generate a table that holds the width of all instructions.
466 *
Andy McFaddena0929372010-11-11 16:49:22 -0800467 * Unimplemented instructions have a width of zero.
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800468 *
469 * I'm doing it with a giant switch statement because it's easier to
470 * maintain and update than a static table with 256 unadorned integers,
471 * and if we're missing a case gcc emits a "warning: enumeration value not
472 * handled" message.
473 *
474 * (To save space in the binary we could generate a static table with a
475 * command-line utility.)
476 */
477InstructionWidth* dexCreateInstrWidthTable(void)
478{
David 'Digit' Turnerec628b52009-09-20 11:58:16 -0700479#ifdef __ARM_ARCH_7A__
480 /* hack to work around mysterious problem on emulator */
481 LOGD("creating instr width table\n");
482#endif
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800483 InstructionWidth* instrWidth;
484 int i;
485
486 instrWidth = malloc(sizeof(InstructionWidth) * kNumDalvikInstructions);
487 if (instrWidth == NULL)
488 return NULL;
489
490 for (i = 0; i < kNumDalvikInstructions; i++) {
491 OpCode opc = (OpCode) i;
492 int width = 0;
493
494 switch (opc) {
Andy McFadden3a1aedb2009-05-07 13:30:23 -0700495 case OP_NOP: /* note data for e.g. switch-* encoded "inside" a NOP */
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800496 case OP_MOVE:
497 case OP_MOVE_WIDE:
498 case OP_MOVE_OBJECT:
499 case OP_MOVE_RESULT:
500 case OP_MOVE_RESULT_WIDE:
501 case OP_MOVE_RESULT_OBJECT:
502 case OP_MOVE_EXCEPTION:
503 case OP_RETURN_VOID:
504 case OP_RETURN:
505 case OP_RETURN_WIDE:
506 case OP_RETURN_OBJECT:
507 case OP_CONST_4:
508 case OP_MONITOR_ENTER:
509 case OP_MONITOR_EXIT:
510 case OP_ARRAY_LENGTH:
511 case OP_THROW:
512 case OP_GOTO:
513 case OP_NEG_INT:
514 case OP_NOT_INT:
515 case OP_NEG_LONG:
516 case OP_NOT_LONG:
517 case OP_NEG_FLOAT:
518 case OP_NEG_DOUBLE:
519 case OP_INT_TO_LONG:
520 case OP_INT_TO_FLOAT:
521 case OP_INT_TO_DOUBLE:
522 case OP_LONG_TO_INT:
523 case OP_LONG_TO_FLOAT:
524 case OP_LONG_TO_DOUBLE:
525 case OP_FLOAT_TO_INT:
526 case OP_FLOAT_TO_LONG:
527 case OP_FLOAT_TO_DOUBLE:
528 case OP_DOUBLE_TO_INT:
529 case OP_DOUBLE_TO_LONG:
530 case OP_DOUBLE_TO_FLOAT:
531 case OP_INT_TO_BYTE:
532 case OP_INT_TO_CHAR:
533 case OP_INT_TO_SHORT:
534 case OP_ADD_INT_2ADDR:
535 case OP_SUB_INT_2ADDR:
536 case OP_MUL_INT_2ADDR:
537 case OP_DIV_INT_2ADDR:
538 case OP_REM_INT_2ADDR:
539 case OP_AND_INT_2ADDR:
540 case OP_OR_INT_2ADDR:
541 case OP_XOR_INT_2ADDR:
542 case OP_SHL_INT_2ADDR:
543 case OP_SHR_INT_2ADDR:
544 case OP_USHR_INT_2ADDR:
545 case OP_ADD_LONG_2ADDR:
546 case OP_SUB_LONG_2ADDR:
547 case OP_MUL_LONG_2ADDR:
548 case OP_DIV_LONG_2ADDR:
549 case OP_REM_LONG_2ADDR:
550 case OP_AND_LONG_2ADDR:
551 case OP_OR_LONG_2ADDR:
552 case OP_XOR_LONG_2ADDR:
553 case OP_SHL_LONG_2ADDR:
554 case OP_SHR_LONG_2ADDR:
555 case OP_USHR_LONG_2ADDR:
556 case OP_ADD_FLOAT_2ADDR:
557 case OP_SUB_FLOAT_2ADDR:
558 case OP_MUL_FLOAT_2ADDR:
559 case OP_DIV_FLOAT_2ADDR:
560 case OP_REM_FLOAT_2ADDR:
561 case OP_ADD_DOUBLE_2ADDR:
562 case OP_SUB_DOUBLE_2ADDR:
563 case OP_MUL_DOUBLE_2ADDR:
564 case OP_DIV_DOUBLE_2ADDR:
565 case OP_REM_DOUBLE_2ADDR:
566 width = 1;
567 break;
568
569 case OP_MOVE_FROM16:
570 case OP_MOVE_WIDE_FROM16:
571 case OP_MOVE_OBJECT_FROM16:
572 case OP_CONST_16:
573 case OP_CONST_HIGH16:
574 case OP_CONST_WIDE_16:
575 case OP_CONST_WIDE_HIGH16:
576 case OP_CONST_STRING:
577 case OP_CONST_CLASS:
578 case OP_CHECK_CAST:
579 case OP_INSTANCE_OF:
580 case OP_NEW_INSTANCE:
581 case OP_NEW_ARRAY:
582 case OP_CMPL_FLOAT:
583 case OP_CMPG_FLOAT:
584 case OP_CMPL_DOUBLE:
585 case OP_CMPG_DOUBLE:
586 case OP_CMP_LONG:
587 case OP_GOTO_16:
588 case OP_IF_EQ:
589 case OP_IF_NE:
590 case OP_IF_LT:
591 case OP_IF_GE:
592 case OP_IF_GT:
593 case OP_IF_LE:
594 case OP_IF_EQZ:
595 case OP_IF_NEZ:
596 case OP_IF_LTZ:
597 case OP_IF_GEZ:
598 case OP_IF_GTZ:
599 case OP_IF_LEZ:
600 case OP_AGET:
601 case OP_AGET_WIDE:
602 case OP_AGET_OBJECT:
603 case OP_AGET_BOOLEAN:
604 case OP_AGET_BYTE:
605 case OP_AGET_CHAR:
606 case OP_AGET_SHORT:
607 case OP_APUT:
608 case OP_APUT_WIDE:
609 case OP_APUT_OBJECT:
610 case OP_APUT_BOOLEAN:
611 case OP_APUT_BYTE:
612 case OP_APUT_CHAR:
613 case OP_APUT_SHORT:
614 case OP_IGET:
615 case OP_IGET_WIDE:
616 case OP_IGET_OBJECT:
617 case OP_IGET_BOOLEAN:
618 case OP_IGET_BYTE:
619 case OP_IGET_CHAR:
620 case OP_IGET_SHORT:
621 case OP_IPUT:
622 case OP_IPUT_WIDE:
623 case OP_IPUT_OBJECT:
624 case OP_IPUT_BOOLEAN:
625 case OP_IPUT_BYTE:
626 case OP_IPUT_CHAR:
627 case OP_IPUT_SHORT:
628 case OP_SGET:
629 case OP_SGET_WIDE:
630 case OP_SGET_OBJECT:
631 case OP_SGET_BOOLEAN:
632 case OP_SGET_BYTE:
633 case OP_SGET_CHAR:
634 case OP_SGET_SHORT:
635 case OP_SPUT:
636 case OP_SPUT_WIDE:
637 case OP_SPUT_OBJECT:
638 case OP_SPUT_BOOLEAN:
639 case OP_SPUT_BYTE:
640 case OP_SPUT_CHAR:
641 case OP_SPUT_SHORT:
642 case OP_ADD_INT:
643 case OP_SUB_INT:
644 case OP_MUL_INT:
645 case OP_DIV_INT:
646 case OP_REM_INT:
647 case OP_AND_INT:
648 case OP_OR_INT:
649 case OP_XOR_INT:
650 case OP_SHL_INT:
651 case OP_SHR_INT:
652 case OP_USHR_INT:
653 case OP_ADD_LONG:
654 case OP_SUB_LONG:
655 case OP_MUL_LONG:
656 case OP_DIV_LONG:
657 case OP_REM_LONG:
658 case OP_AND_LONG:
659 case OP_OR_LONG:
660 case OP_XOR_LONG:
661 case OP_SHL_LONG:
662 case OP_SHR_LONG:
663 case OP_USHR_LONG:
664 case OP_ADD_FLOAT:
665 case OP_SUB_FLOAT:
666 case OP_MUL_FLOAT:
667 case OP_DIV_FLOAT:
668 case OP_REM_FLOAT:
669 case OP_ADD_DOUBLE:
670 case OP_SUB_DOUBLE:
671 case OP_MUL_DOUBLE:
672 case OP_DIV_DOUBLE:
673 case OP_REM_DOUBLE:
674 case OP_ADD_INT_LIT16:
675 case OP_RSUB_INT:
676 case OP_MUL_INT_LIT16:
677 case OP_DIV_INT_LIT16:
678 case OP_REM_INT_LIT16:
679 case OP_AND_INT_LIT16:
680 case OP_OR_INT_LIT16:
681 case OP_XOR_INT_LIT16:
682 case OP_ADD_INT_LIT8:
683 case OP_RSUB_INT_LIT8:
684 case OP_MUL_INT_LIT8:
685 case OP_DIV_INT_LIT8:
686 case OP_REM_INT_LIT8:
687 case OP_AND_INT_LIT8:
688 case OP_OR_INT_LIT8:
689 case OP_XOR_INT_LIT8:
690 case OP_SHL_INT_LIT8:
691 case OP_SHR_INT_LIT8:
692 case OP_USHR_INT_LIT8:
693 width = 2;
694 break;
695
696 case OP_MOVE_16:
697 case OP_MOVE_WIDE_16:
698 case OP_MOVE_OBJECT_16:
699 case OP_CONST:
700 case OP_CONST_WIDE_32:
701 case OP_CONST_STRING_JUMBO:
702 case OP_GOTO_32:
703 case OP_FILLED_NEW_ARRAY:
704 case OP_FILLED_NEW_ARRAY_RANGE:
705 case OP_FILL_ARRAY_DATA:
706 case OP_PACKED_SWITCH:
707 case OP_SPARSE_SWITCH:
708 case OP_INVOKE_VIRTUAL:
709 case OP_INVOKE_SUPER:
710 case OP_INVOKE_DIRECT:
711 case OP_INVOKE_STATIC:
712 case OP_INVOKE_INTERFACE:
713 case OP_INVOKE_VIRTUAL_RANGE:
714 case OP_INVOKE_SUPER_RANGE:
715 case OP_INVOKE_DIRECT_RANGE:
716 case OP_INVOKE_STATIC_RANGE:
717 case OP_INVOKE_INTERFACE_RANGE:
718 width = 3;
719 break;
720
721 case OP_CONST_WIDE:
722 width = 5;
723 break;
724
725 /*
Andy McFaddena0929372010-11-11 16:49:22 -0800726 * Optimized instructions.
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800727 */
Andy McFadden291758c2010-09-10 08:04:52 -0700728 case OP_RETURN_VOID_BARRIER:
Andy McFaddena0929372010-11-11 16:49:22 -0800729 width = 1;
Andy McFadden291758c2010-09-10 08:04:52 -0700730 break;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800731 case OP_IGET_QUICK:
732 case OP_IGET_WIDE_QUICK:
733 case OP_IGET_OBJECT_QUICK:
734 case OP_IPUT_QUICK:
735 case OP_IPUT_WIDE_QUICK:
736 case OP_IPUT_OBJECT_QUICK:
Andy McFaddenc35a2ef2010-06-17 12:36:00 -0700737 case OP_IGET_VOLATILE:
738 case OP_IPUT_VOLATILE:
739 case OP_SGET_VOLATILE:
740 case OP_SPUT_VOLATILE:
741 case OP_IGET_OBJECT_VOLATILE:
742 case OP_IPUT_OBJECT_VOLATILE:
743 case OP_SGET_OBJECT_VOLATILE:
744 case OP_SPUT_OBJECT_VOLATILE:
Andy McFadden53878242010-03-05 07:24:27 -0800745 case OP_IGET_WIDE_VOLATILE:
746 case OP_IPUT_WIDE_VOLATILE:
747 case OP_SGET_WIDE_VOLATILE:
748 case OP_SPUT_WIDE_VOLATILE:
Andy McFadden3a1aedb2009-05-07 13:30:23 -0700749 case OP_THROW_VERIFICATION_ERROR:
Andy McFaddena0929372010-11-11 16:49:22 -0800750 width = 2;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800751 break;
752 case OP_INVOKE_VIRTUAL_QUICK:
753 case OP_INVOKE_VIRTUAL_QUICK_RANGE:
754 case OP_INVOKE_SUPER_QUICK:
755 case OP_INVOKE_SUPER_QUICK_RANGE:
756 case OP_EXECUTE_INLINE:
Andy McFaddenb0a05412009-11-19 10:23:41 -0800757 case OP_EXECUTE_INLINE_RANGE:
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800758 case OP_INVOKE_DIRECT_EMPTY:
Andy McFaddena0929372010-11-11 16:49:22 -0800759 width = 3;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800760 break;
761
Andy McFadden96516932009-10-28 17:39:02 -0700762 /* these should never appear when scanning bytecode */
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800763 case OP_UNUSED_3E:
764 case OP_UNUSED_3F:
765 case OP_UNUSED_40:
766 case OP_UNUSED_41:
767 case OP_UNUSED_42:
768 case OP_UNUSED_43:
769 case OP_UNUSED_73:
770 case OP_UNUSED_79:
771 case OP_UNUSED_7A:
Andy McFadden96516932009-10-28 17:39:02 -0700772 case OP_BREAKPOINT:
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800773 case OP_UNUSED_FF:
774 assert(width == 0);
775 break;
776
777 /*
778 * DO NOT add a "default" clause here. Without it the compiler will
779 * complain if an instruction is missing (which is desirable).
780 */
781 }
782
783 instrWidth[opc] = width;
784 }
785
786 return instrWidth;
787}
788
789/*
790 * Generate a table that holds instruction flags.
791 */
792InstructionFlags* dexCreateInstrFlagsTable(void)
793{
794 InstructionFlags* instrFlags;
795 int i;
796
797 instrFlags = malloc(sizeof(InstructionFlags) * kNumDalvikInstructions);
798 if (instrFlags == NULL)
799 return NULL;
800
801 for (i = 0; i < kNumDalvikInstructions; i++) {
802 OpCode opc = (OpCode) i;
803 InstructionFlags flags = 0;
804
805 switch (opc) {
806 /* these don't affect the PC and can't cause an exception */
807 case OP_NOP:
808 case OP_MOVE:
809 case OP_MOVE_FROM16:
810 case OP_MOVE_16:
811 case OP_MOVE_WIDE:
812 case OP_MOVE_WIDE_FROM16:
813 case OP_MOVE_WIDE_16:
814 case OP_MOVE_OBJECT:
815 case OP_MOVE_OBJECT_FROM16:
816 case OP_MOVE_OBJECT_16:
817 case OP_MOVE_RESULT:
818 case OP_MOVE_RESULT_WIDE:
819 case OP_MOVE_RESULT_OBJECT:
820 case OP_MOVE_EXCEPTION:
821 case OP_CONST_4:
822 case OP_CONST_16:
823 case OP_CONST:
824 case OP_CONST_HIGH16:
825 case OP_CONST_WIDE_16:
826 case OP_CONST_WIDE_32:
827 case OP_CONST_WIDE:
828 case OP_CONST_WIDE_HIGH16:
829 case OP_FILL_ARRAY_DATA:
830 case OP_CMPL_FLOAT:
831 case OP_CMPG_FLOAT:
832 case OP_CMPL_DOUBLE:
833 case OP_CMPG_DOUBLE:
834 case OP_CMP_LONG:
835 case OP_NEG_INT:
836 case OP_NOT_INT:
837 case OP_NEG_LONG:
838 case OP_NOT_LONG:
839 case OP_NEG_FLOAT:
840 case OP_NEG_DOUBLE:
841 case OP_INT_TO_LONG:
842 case OP_INT_TO_FLOAT:
843 case OP_INT_TO_DOUBLE:
844 case OP_LONG_TO_INT:
845 case OP_LONG_TO_FLOAT:
846 case OP_LONG_TO_DOUBLE:
847 case OP_FLOAT_TO_INT:
848 case OP_FLOAT_TO_LONG:
849 case OP_FLOAT_TO_DOUBLE:
850 case OP_DOUBLE_TO_INT:
851 case OP_DOUBLE_TO_LONG:
852 case OP_DOUBLE_TO_FLOAT:
853 case OP_INT_TO_BYTE:
854 case OP_INT_TO_CHAR:
855 case OP_INT_TO_SHORT:
856 case OP_ADD_INT:
857 case OP_SUB_INT:
858 case OP_MUL_INT:
859 case OP_AND_INT:
860 case OP_OR_INT:
861 case OP_XOR_INT:
862 case OP_SHL_INT:
863 case OP_SHR_INT:
864 case OP_USHR_INT:
865 case OP_ADD_LONG:
866 case OP_SUB_LONG:
867 case OP_MUL_LONG:
868 case OP_AND_LONG:
869 case OP_OR_LONG:
870 case OP_XOR_LONG:
871 case OP_SHL_LONG:
872 case OP_SHR_LONG:
873 case OP_USHR_LONG:
874 case OP_ADD_FLOAT:
875 case OP_SUB_FLOAT:
876 case OP_MUL_FLOAT:
877 case OP_DIV_FLOAT:
878 case OP_REM_FLOAT:
879 case OP_ADD_DOUBLE:
880 case OP_SUB_DOUBLE:
881 case OP_MUL_DOUBLE:
882 case OP_DIV_DOUBLE: // div by zero just returns NaN
883 case OP_REM_DOUBLE:
884 case OP_ADD_INT_2ADDR:
885 case OP_SUB_INT_2ADDR:
886 case OP_MUL_INT_2ADDR:
887 case OP_AND_INT_2ADDR:
888 case OP_OR_INT_2ADDR:
889 case OP_XOR_INT_2ADDR:
890 case OP_SHL_INT_2ADDR:
891 case OP_SHR_INT_2ADDR:
892 case OP_USHR_INT_2ADDR:
893 case OP_ADD_LONG_2ADDR:
894 case OP_SUB_LONG_2ADDR:
895 case OP_MUL_LONG_2ADDR:
896 case OP_AND_LONG_2ADDR:
897 case OP_OR_LONG_2ADDR:
898 case OP_XOR_LONG_2ADDR:
899 case OP_SHL_LONG_2ADDR:
900 case OP_SHR_LONG_2ADDR:
901 case OP_USHR_LONG_2ADDR:
902 case OP_ADD_FLOAT_2ADDR:
903 case OP_SUB_FLOAT_2ADDR:
904 case OP_MUL_FLOAT_2ADDR:
905 case OP_DIV_FLOAT_2ADDR:
906 case OP_REM_FLOAT_2ADDR:
907 case OP_ADD_DOUBLE_2ADDR:
908 case OP_SUB_DOUBLE_2ADDR:
909 case OP_MUL_DOUBLE_2ADDR:
910 case OP_DIV_DOUBLE_2ADDR:
911 case OP_REM_DOUBLE_2ADDR:
912 case OP_ADD_INT_LIT16:
913 case OP_RSUB_INT:
914 case OP_MUL_INT_LIT16:
915 case OP_AND_INT_LIT16:
916 case OP_OR_INT_LIT16:
917 case OP_XOR_INT_LIT16:
918 case OP_ADD_INT_LIT8:
919 case OP_RSUB_INT_LIT8:
920 case OP_MUL_INT_LIT8:
921 case OP_AND_INT_LIT8:
922 case OP_OR_INT_LIT8:
923 case OP_XOR_INT_LIT8:
924 case OP_SHL_INT_LIT8:
925 case OP_SHR_INT_LIT8:
926 case OP_USHR_INT_LIT8:
927 flags = kInstrCanContinue;
928 break;
929
930 /* these don't affect the PC, but can cause exceptions */
931 case OP_CONST_STRING:
932 case OP_CONST_STRING_JUMBO:
933 case OP_CONST_CLASS:
934 case OP_MONITOR_ENTER:
935 case OP_MONITOR_EXIT:
936 case OP_CHECK_CAST:
937 case OP_INSTANCE_OF:
938 case OP_ARRAY_LENGTH:
939 case OP_NEW_INSTANCE:
940 case OP_NEW_ARRAY:
941 case OP_FILLED_NEW_ARRAY:
942 case OP_FILLED_NEW_ARRAY_RANGE:
943 case OP_AGET:
944 case OP_AGET_BOOLEAN:
945 case OP_AGET_BYTE:
946 case OP_AGET_CHAR:
947 case OP_AGET_SHORT:
948 case OP_AGET_WIDE:
949 case OP_AGET_OBJECT:
950 case OP_APUT:
951 case OP_APUT_BOOLEAN:
952 case OP_APUT_BYTE:
953 case OP_APUT_CHAR:
954 case OP_APUT_SHORT:
955 case OP_APUT_WIDE:
956 case OP_APUT_OBJECT:
957 case OP_IGET:
958 case OP_IGET_BOOLEAN:
959 case OP_IGET_BYTE:
960 case OP_IGET_CHAR:
961 case OP_IGET_SHORT:
962 case OP_IGET_WIDE:
963 case OP_IGET_OBJECT:
964 case OP_IPUT:
965 case OP_IPUT_BOOLEAN:
966 case OP_IPUT_BYTE:
967 case OP_IPUT_CHAR:
968 case OP_IPUT_SHORT:
969 case OP_IPUT_WIDE:
970 case OP_IPUT_OBJECT:
971 case OP_SGET:
972 case OP_SGET_BOOLEAN:
973 case OP_SGET_BYTE:
974 case OP_SGET_CHAR:
975 case OP_SGET_SHORT:
976 case OP_SGET_WIDE:
977 case OP_SGET_OBJECT:
978 case OP_SPUT:
979 case OP_SPUT_BOOLEAN:
980 case OP_SPUT_BYTE:
981 case OP_SPUT_CHAR:
982 case OP_SPUT_SHORT:
983 case OP_SPUT_WIDE:
984 case OP_SPUT_OBJECT:
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800985 case OP_DIV_INT:
986 case OP_REM_INT:
987 case OP_DIV_LONG:
988 case OP_REM_LONG:
989 case OP_DIV_INT_2ADDR:
990 case OP_REM_INT_2ADDR:
991 case OP_DIV_LONG_2ADDR:
992 case OP_REM_LONG_2ADDR:
993 case OP_DIV_INT_LIT16:
994 case OP_REM_INT_LIT16:
995 case OP_DIV_INT_LIT8:
996 case OP_REM_INT_LIT8:
997 flags = kInstrCanContinue | kInstrCanThrow;
998 break;
999
Ben Chengba4fc8b2009-06-01 13:00:29 -07001000 case OP_INVOKE_VIRTUAL:
1001 case OP_INVOKE_VIRTUAL_RANGE:
1002 case OP_INVOKE_SUPER:
1003 case OP_INVOKE_SUPER_RANGE:
1004 case OP_INVOKE_DIRECT:
1005 case OP_INVOKE_DIRECT_RANGE:
1006 case OP_INVOKE_STATIC:
1007 case OP_INVOKE_STATIC_RANGE:
1008 case OP_INVOKE_INTERFACE:
1009 case OP_INVOKE_INTERFACE_RANGE:
1010 flags = kInstrCanContinue | kInstrCanThrow | kInstrInvoke;
1011 break;
1012
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001013 case OP_RETURN_VOID:
1014 case OP_RETURN:
1015 case OP_RETURN_WIDE:
1016 case OP_RETURN_OBJECT:
1017 flags = kInstrCanReturn;
1018 break;
1019
1020 case OP_THROW:
1021 flags = kInstrCanThrow;
1022 break;
1023
1024 /* unconditional branches */
1025 case OP_GOTO:
1026 case OP_GOTO_16:
1027 case OP_GOTO_32:
Dan Bornsteinc2b486f2010-11-12 16:07:16 -08001028 flags = kInstrCanBranch;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001029 break;
1030
1031 /* conditional branches */
1032 case OP_IF_EQ:
1033 case OP_IF_NE:
1034 case OP_IF_LT:
1035 case OP_IF_GE:
1036 case OP_IF_GT:
1037 case OP_IF_LE:
1038 case OP_IF_EQZ:
1039 case OP_IF_NEZ:
1040 case OP_IF_LTZ:
1041 case OP_IF_GEZ:
1042 case OP_IF_GTZ:
1043 case OP_IF_LEZ:
1044 flags = kInstrCanBranch | kInstrCanContinue;
1045 break;
1046
1047 /* switch statements; if value not in switch, it continues */
1048 case OP_PACKED_SWITCH:
1049 case OP_SPARSE_SWITCH:
1050 flags = kInstrCanSwitch | kInstrCanContinue;
1051 break;
1052
Andy McFaddenb51ea112009-05-08 16:50:17 -07001053 /* verifier/optimizer-generated instructions */
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001054 case OP_THROW_VERIFICATION_ERROR:
1055 flags = kInstrCanThrow;
1056 break;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001057 case OP_EXECUTE_INLINE:
Andy McFaddenb0a05412009-11-19 10:23:41 -08001058 case OP_EXECUTE_INLINE_RANGE:
1059 flags = kInstrCanContinue | kInstrCanThrow;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001060 break;
1061 case OP_IGET_QUICK:
1062 case OP_IGET_WIDE_QUICK:
1063 case OP_IGET_OBJECT_QUICK:
1064 case OP_IPUT_QUICK:
1065 case OP_IPUT_WIDE_QUICK:
1066 case OP_IPUT_OBJECT_QUICK:
Andy McFaddenc35a2ef2010-06-17 12:36:00 -07001067 case OP_IGET_VOLATILE:
1068 case OP_IPUT_VOLATILE:
1069 case OP_SGET_VOLATILE:
1070 case OP_SPUT_VOLATILE:
1071 case OP_IGET_OBJECT_VOLATILE:
1072 case OP_IPUT_OBJECT_VOLATILE:
1073 case OP_SGET_OBJECT_VOLATILE:
1074 case OP_SPUT_OBJECT_VOLATILE:
Andy McFadden53878242010-03-05 07:24:27 -08001075 case OP_IGET_WIDE_VOLATILE:
1076 case OP_IPUT_WIDE_VOLATILE:
1077 case OP_SGET_WIDE_VOLATILE:
1078 case OP_SPUT_WIDE_VOLATILE:
Ben Chengba4fc8b2009-06-01 13:00:29 -07001079 flags = kInstrCanContinue | kInstrCanThrow;
1080 break;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001081 case OP_INVOKE_VIRTUAL_QUICK:
1082 case OP_INVOKE_VIRTUAL_QUICK_RANGE:
1083 case OP_INVOKE_SUPER_QUICK:
1084 case OP_INVOKE_SUPER_QUICK_RANGE:
1085 case OP_INVOKE_DIRECT_EMPTY:
Ben Chengba4fc8b2009-06-01 13:00:29 -07001086 flags = kInstrCanContinue | kInstrCanThrow | kInstrInvoke;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001087 break;
Andy McFadden291758c2010-09-10 08:04:52 -07001088 case OP_RETURN_VOID_BARRIER:
1089 flags = kInstrCanReturn;
1090 break;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001091
Andy McFadden96516932009-10-28 17:39:02 -07001092 /* these should never appear when scanning code */
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001093 case OP_UNUSED_3E:
1094 case OP_UNUSED_3F:
1095 case OP_UNUSED_40:
1096 case OP_UNUSED_41:
1097 case OP_UNUSED_42:
1098 case OP_UNUSED_43:
1099 case OP_UNUSED_73:
1100 case OP_UNUSED_79:
1101 case OP_UNUSED_7A:
Andy McFadden96516932009-10-28 17:39:02 -07001102 case OP_BREAKPOINT:
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001103 case OP_UNUSED_FF:
1104 break;
1105
1106 /*
1107 * DO NOT add a "default" clause here. Without it the compiler will
1108 * complain if an instruction is missing (which is desirable).
1109 */
1110 }
1111
1112 instrFlags[opc] = flags;
1113 }
1114
1115 return instrFlags;
1116}
1117
1118/*
1119 * Allocate and populate a 256-element array with instruction formats.
1120 * Used in conjunction with dexDecodeInstruction.
1121 */
1122InstructionFormat* dexCreateInstrFormatTable(void)
1123{
1124 InstructionFormat* instFmt;
1125 int i;
1126
1127 instFmt = malloc(sizeof(InstructionFormat) * kNumDalvikInstructions);
1128 if (instFmt == NULL)
1129 return NULL;
1130
1131 for (i = 0; i < kNumDalvikInstructions; i++) {
1132 OpCode opc = (OpCode) i;
Dan Bornstein84244322010-11-17 12:05:04 -08001133 InstructionFormat fmt = kFmt00x;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001134
1135 switch (opc) {
1136 case OP_GOTO:
1137 fmt = kFmt10t;
1138 break;
1139 case OP_NOP:
1140 case OP_RETURN_VOID:
1141 fmt = kFmt10x;
1142 break;
1143 case OP_CONST_4:
1144 fmt = kFmt11n;
1145 break;
1146 case OP_CONST_HIGH16:
1147 case OP_CONST_WIDE_HIGH16:
1148 fmt = kFmt21h;
1149 break;
1150 case OP_MOVE_RESULT:
1151 case OP_MOVE_RESULT_WIDE:
1152 case OP_MOVE_RESULT_OBJECT:
1153 case OP_MOVE_EXCEPTION:
1154 case OP_RETURN:
1155 case OP_RETURN_WIDE:
1156 case OP_RETURN_OBJECT:
1157 case OP_MONITOR_ENTER:
1158 case OP_MONITOR_EXIT:
1159 case OP_THROW:
1160 fmt = kFmt11x;
1161 break;
1162 case OP_MOVE:
1163 case OP_MOVE_WIDE:
1164 case OP_MOVE_OBJECT:
1165 case OP_ARRAY_LENGTH:
1166 case OP_NEG_INT:
1167 case OP_NOT_INT:
1168 case OP_NEG_LONG:
1169 case OP_NOT_LONG:
1170 case OP_NEG_FLOAT:
1171 case OP_NEG_DOUBLE:
1172 case OP_INT_TO_LONG:
1173 case OP_INT_TO_FLOAT:
1174 case OP_INT_TO_DOUBLE:
1175 case OP_LONG_TO_INT:
1176 case OP_LONG_TO_FLOAT:
1177 case OP_LONG_TO_DOUBLE:
1178 case OP_FLOAT_TO_INT:
1179 case OP_FLOAT_TO_LONG:
1180 case OP_FLOAT_TO_DOUBLE:
1181 case OP_DOUBLE_TO_INT:
1182 case OP_DOUBLE_TO_LONG:
1183 case OP_DOUBLE_TO_FLOAT:
1184 case OP_INT_TO_BYTE:
1185 case OP_INT_TO_CHAR:
1186 case OP_INT_TO_SHORT:
1187 case OP_ADD_INT_2ADDR:
1188 case OP_SUB_INT_2ADDR:
1189 case OP_MUL_INT_2ADDR:
1190 case OP_DIV_INT_2ADDR:
1191 case OP_REM_INT_2ADDR:
1192 case OP_AND_INT_2ADDR:
1193 case OP_OR_INT_2ADDR:
1194 case OP_XOR_INT_2ADDR:
1195 case OP_SHL_INT_2ADDR:
1196 case OP_SHR_INT_2ADDR:
1197 case OP_USHR_INT_2ADDR:
1198 case OP_ADD_LONG_2ADDR:
1199 case OP_SUB_LONG_2ADDR:
1200 case OP_MUL_LONG_2ADDR:
1201 case OP_DIV_LONG_2ADDR:
1202 case OP_REM_LONG_2ADDR:
1203 case OP_AND_LONG_2ADDR:
1204 case OP_OR_LONG_2ADDR:
1205 case OP_XOR_LONG_2ADDR:
1206 case OP_SHL_LONG_2ADDR:
1207 case OP_SHR_LONG_2ADDR:
1208 case OP_USHR_LONG_2ADDR:
1209 case OP_ADD_FLOAT_2ADDR:
1210 case OP_SUB_FLOAT_2ADDR:
1211 case OP_MUL_FLOAT_2ADDR:
1212 case OP_DIV_FLOAT_2ADDR:
1213 case OP_REM_FLOAT_2ADDR:
1214 case OP_ADD_DOUBLE_2ADDR:
1215 case OP_SUB_DOUBLE_2ADDR:
1216 case OP_MUL_DOUBLE_2ADDR:
1217 case OP_DIV_DOUBLE_2ADDR:
1218 case OP_REM_DOUBLE_2ADDR:
1219 fmt = kFmt12x;
1220 break;
1221 case OP_GOTO_16:
1222 fmt = kFmt20t;
1223 break;
1224 case OP_GOTO_32:
1225 fmt = kFmt30t;
1226 break;
1227 case OP_CONST_STRING:
1228 case OP_CONST_CLASS:
1229 case OP_CHECK_CAST:
1230 case OP_NEW_INSTANCE:
1231 case OP_SGET:
1232 case OP_SGET_WIDE:
1233 case OP_SGET_OBJECT:
1234 case OP_SGET_BOOLEAN:
1235 case OP_SGET_BYTE:
1236 case OP_SGET_CHAR:
1237 case OP_SGET_SHORT:
1238 case OP_SPUT:
1239 case OP_SPUT_WIDE:
1240 case OP_SPUT_OBJECT:
1241 case OP_SPUT_BOOLEAN:
1242 case OP_SPUT_BYTE:
1243 case OP_SPUT_CHAR:
1244 case OP_SPUT_SHORT:
1245 fmt = kFmt21c;
1246 break;
1247 case OP_CONST_16:
1248 case OP_CONST_WIDE_16:
1249 fmt = kFmt21s;
1250 break;
1251 case OP_IF_EQZ:
1252 case OP_IF_NEZ:
1253 case OP_IF_LTZ:
1254 case OP_IF_GEZ:
1255 case OP_IF_GTZ:
1256 case OP_IF_LEZ:
1257 fmt = kFmt21t;
1258 break;
1259 case OP_FILL_ARRAY_DATA:
1260 case OP_PACKED_SWITCH:
1261 case OP_SPARSE_SWITCH:
1262 fmt = kFmt31t;
1263 break;
1264 case OP_ADD_INT_LIT8:
1265 case OP_RSUB_INT_LIT8:
1266 case OP_MUL_INT_LIT8:
1267 case OP_DIV_INT_LIT8:
1268 case OP_REM_INT_LIT8:
1269 case OP_AND_INT_LIT8:
1270 case OP_OR_INT_LIT8:
1271 case OP_XOR_INT_LIT8:
1272 case OP_SHL_INT_LIT8:
1273 case OP_SHR_INT_LIT8:
1274 case OP_USHR_INT_LIT8:
1275 fmt = kFmt22b;
1276 break;
1277 case OP_INSTANCE_OF:
1278 case OP_NEW_ARRAY:
1279 case OP_IGET:
1280 case OP_IGET_WIDE:
1281 case OP_IGET_OBJECT:
1282 case OP_IGET_BOOLEAN:
1283 case OP_IGET_BYTE:
1284 case OP_IGET_CHAR:
1285 case OP_IGET_SHORT:
1286 case OP_IPUT:
1287 case OP_IPUT_WIDE:
1288 case OP_IPUT_OBJECT:
1289 case OP_IPUT_BOOLEAN:
1290 case OP_IPUT_BYTE:
1291 case OP_IPUT_CHAR:
1292 case OP_IPUT_SHORT:
1293 fmt = kFmt22c;
1294 break;
1295 case OP_ADD_INT_LIT16:
1296 case OP_RSUB_INT:
1297 case OP_MUL_INT_LIT16:
1298 case OP_DIV_INT_LIT16:
1299 case OP_REM_INT_LIT16:
1300 case OP_AND_INT_LIT16:
1301 case OP_OR_INT_LIT16:
1302 case OP_XOR_INT_LIT16:
1303 fmt = kFmt22s;
1304 break;
1305 case OP_IF_EQ:
1306 case OP_IF_NE:
1307 case OP_IF_LT:
1308 case OP_IF_GE:
1309 case OP_IF_GT:
1310 case OP_IF_LE:
1311 fmt = kFmt22t;
1312 break;
1313 case OP_MOVE_FROM16:
1314 case OP_MOVE_WIDE_FROM16:
1315 case OP_MOVE_OBJECT_FROM16:
1316 fmt = kFmt22x;
1317 break;
1318 case OP_CMPL_FLOAT:
1319 case OP_CMPG_FLOAT:
1320 case OP_CMPL_DOUBLE:
1321 case OP_CMPG_DOUBLE:
1322 case OP_CMP_LONG:
1323 case OP_AGET:
1324 case OP_AGET_WIDE:
1325 case OP_AGET_OBJECT:
1326 case OP_AGET_BOOLEAN:
1327 case OP_AGET_BYTE:
1328 case OP_AGET_CHAR:
1329 case OP_AGET_SHORT:
1330 case OP_APUT:
1331 case OP_APUT_WIDE:
1332 case OP_APUT_OBJECT:
1333 case OP_APUT_BOOLEAN:
1334 case OP_APUT_BYTE:
1335 case OP_APUT_CHAR:
1336 case OP_APUT_SHORT:
1337 case OP_ADD_INT:
1338 case OP_SUB_INT:
1339 case OP_MUL_INT:
1340 case OP_DIV_INT:
1341 case OP_REM_INT:
1342 case OP_AND_INT:
1343 case OP_OR_INT:
1344 case OP_XOR_INT:
1345 case OP_SHL_INT:
1346 case OP_SHR_INT:
1347 case OP_USHR_INT:
1348 case OP_ADD_LONG:
1349 case OP_SUB_LONG:
1350 case OP_MUL_LONG:
1351 case OP_DIV_LONG:
1352 case OP_REM_LONG:
1353 case OP_AND_LONG:
1354 case OP_OR_LONG:
1355 case OP_XOR_LONG:
1356 case OP_SHL_LONG:
1357 case OP_SHR_LONG:
1358 case OP_USHR_LONG:
1359 case OP_ADD_FLOAT:
1360 case OP_SUB_FLOAT:
1361 case OP_MUL_FLOAT:
1362 case OP_DIV_FLOAT:
1363 case OP_REM_FLOAT:
1364 case OP_ADD_DOUBLE:
1365 case OP_SUB_DOUBLE:
1366 case OP_MUL_DOUBLE:
1367 case OP_DIV_DOUBLE:
1368 case OP_REM_DOUBLE:
1369 fmt = kFmt23x;
1370 break;
1371 case OP_CONST:
1372 case OP_CONST_WIDE_32:
1373 fmt = kFmt31i;
1374 break;
1375 case OP_CONST_STRING_JUMBO:
1376 fmt = kFmt31c;
1377 break;
1378 case OP_MOVE_16:
1379 case OP_MOVE_WIDE_16:
1380 case OP_MOVE_OBJECT_16:
1381 fmt = kFmt32x;
1382 break;
1383 case OP_FILLED_NEW_ARRAY:
1384 case OP_INVOKE_VIRTUAL:
1385 case OP_INVOKE_SUPER:
1386 case OP_INVOKE_DIRECT:
1387 case OP_INVOKE_STATIC:
1388 case OP_INVOKE_INTERFACE:
1389 fmt = kFmt35c;
1390 break;
1391 case OP_FILLED_NEW_ARRAY_RANGE:
1392 case OP_INVOKE_VIRTUAL_RANGE:
1393 case OP_INVOKE_SUPER_RANGE:
1394 case OP_INVOKE_DIRECT_RANGE:
1395 case OP_INVOKE_STATIC_RANGE:
1396 case OP_INVOKE_INTERFACE_RANGE:
1397 fmt = kFmt3rc;
1398 break;
1399 case OP_CONST_WIDE:
1400 fmt = kFmt51l;
1401 break;
1402
1403 /*
1404 * Optimized instructions.
1405 */
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001406 case OP_THROW_VERIFICATION_ERROR:
1407 fmt = kFmt20bc;
1408 break;
Andy McFadden53878242010-03-05 07:24:27 -08001409 case OP_IGET_WIDE_VOLATILE:
1410 case OP_IPUT_WIDE_VOLATILE:
Andy McFaddenc35a2ef2010-06-17 12:36:00 -07001411 case OP_IGET_VOLATILE:
1412 case OP_IPUT_VOLATILE:
Andy McFaddenc35a2ef2010-06-17 12:36:00 -07001413 case OP_IGET_OBJECT_VOLATILE:
1414 case OP_IPUT_OBJECT_VOLATILE:
buzbeeddc7d292010-09-02 17:16:24 -07001415 fmt = kFmt22c;
1416 break;
Andy McFaddenc35a2ef2010-06-17 12:36:00 -07001417 case OP_SGET_OBJECT_VOLATILE:
1418 case OP_SPUT_OBJECT_VOLATILE:
buzbeeddc7d292010-09-02 17:16:24 -07001419 case OP_SGET_VOLATILE:
1420 case OP_SPUT_VOLATILE:
1421 case OP_SGET_WIDE_VOLATILE:
1422 case OP_SPUT_WIDE_VOLATILE:
1423 fmt = kFmt21c;
Andy McFadden53878242010-03-05 07:24:27 -08001424 break;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001425 case OP_IGET_QUICK:
1426 case OP_IGET_WIDE_QUICK:
1427 case OP_IGET_OBJECT_QUICK:
1428 case OP_IPUT_QUICK:
1429 case OP_IPUT_WIDE_QUICK:
1430 case OP_IPUT_OBJECT_QUICK:
1431 fmt = kFmt22cs;
1432 break;
1433 case OP_INVOKE_VIRTUAL_QUICK:
1434 case OP_INVOKE_SUPER_QUICK:
1435 fmt = kFmt35ms;
1436 break;
1437 case OP_INVOKE_VIRTUAL_QUICK_RANGE:
1438 case OP_INVOKE_SUPER_QUICK_RANGE:
1439 fmt = kFmt3rms;
1440 break;
1441 case OP_EXECUTE_INLINE:
Dan Bornstein7b3e9b02010-11-09 17:15:10 -08001442 fmt = kFmt35mi;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001443 break;
Andy McFaddenb0a05412009-11-19 10:23:41 -08001444 case OP_EXECUTE_INLINE_RANGE:
Dan Bornstein7b3e9b02010-11-09 17:15:10 -08001445 fmt = kFmt3rmi;
Andy McFaddenb0a05412009-11-19 10:23:41 -08001446 break;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001447 case OP_INVOKE_DIRECT_EMPTY:
1448 fmt = kFmt35c;
1449 break;
Andy McFadden291758c2010-09-10 08:04:52 -07001450 case OP_RETURN_VOID_BARRIER:
1451 fmt = kFmt10x;
1452 break;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001453
Andy McFadden96516932009-10-28 17:39:02 -07001454 /* these should never appear when scanning code */
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001455 case OP_UNUSED_3E:
1456 case OP_UNUSED_3F:
1457 case OP_UNUSED_40:
1458 case OP_UNUSED_41:
1459 case OP_UNUSED_42:
1460 case OP_UNUSED_43:
1461 case OP_UNUSED_73:
1462 case OP_UNUSED_79:
1463 case OP_UNUSED_7A:
Andy McFadden96516932009-10-28 17:39:02 -07001464 case OP_BREAKPOINT:
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001465 case OP_UNUSED_FF:
Dan Bornstein84244322010-11-17 12:05:04 -08001466 fmt = kFmt00x;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001467 break;
1468
1469 /*
1470 * DO NOT add a "default" clause here. Without it the compiler will
1471 * complain if an instruction is missing (which is desirable).
1472 */
1473 }
1474
1475 instFmt[opc] = fmt;
1476 }
1477
1478 return instFmt;
1479}
1480
1481/*
Dan Bornstein44a38f42010-11-10 17:34:32 -08001482 * Allocate and populate an array with index types for all instructions.
1483 * Used in conjunction with dexDecodeInstruction.
1484 */
1485InstructionIndexType* dexCreateInstrIndexTypeTable(void)
1486{
1487 InstructionIndexType* indexTypes;
1488 int i;
1489
1490 indexTypes = malloc(sizeof(InstructionIndexType) * kNumDalvikInstructions);
1491 if (indexTypes == NULL)
1492 return NULL;
1493
1494 for (i = 0; i < kNumDalvikInstructions; i++) {
1495 OpCode opc = (OpCode) i;
1496 InstructionIndexType indexType = kIndexUnknown;
1497
1498 switch (opc) {
1499 case OP_GOTO:
1500 case OP_NOP:
1501 case OP_RETURN_VOID:
1502 case OP_CONST_4:
1503 case OP_CONST_HIGH16:
1504 case OP_CONST_WIDE_HIGH16:
1505 case OP_MOVE_RESULT:
1506 case OP_MOVE_RESULT_WIDE:
1507 case OP_MOVE_RESULT_OBJECT:
1508 case OP_MOVE_EXCEPTION:
1509 case OP_RETURN:
1510 case OP_RETURN_WIDE:
1511 case OP_RETURN_OBJECT:
1512 case OP_MONITOR_ENTER:
1513 case OP_MONITOR_EXIT:
1514 case OP_THROW:
1515 case OP_MOVE:
1516 case OP_MOVE_WIDE:
1517 case OP_MOVE_OBJECT:
1518 case OP_ARRAY_LENGTH:
1519 case OP_NEG_INT:
1520 case OP_NOT_INT:
1521 case OP_NEG_LONG:
1522 case OP_NOT_LONG:
1523 case OP_NEG_FLOAT:
1524 case OP_NEG_DOUBLE:
1525 case OP_INT_TO_LONG:
1526 case OP_INT_TO_FLOAT:
1527 case OP_INT_TO_DOUBLE:
1528 case OP_LONG_TO_INT:
1529 case OP_LONG_TO_FLOAT:
1530 case OP_LONG_TO_DOUBLE:
1531 case OP_FLOAT_TO_INT:
1532 case OP_FLOAT_TO_LONG:
1533 case OP_FLOAT_TO_DOUBLE:
1534 case OP_DOUBLE_TO_INT:
1535 case OP_DOUBLE_TO_LONG:
1536 case OP_DOUBLE_TO_FLOAT:
1537 case OP_INT_TO_BYTE:
1538 case OP_INT_TO_CHAR:
1539 case OP_INT_TO_SHORT:
1540 case OP_ADD_INT_2ADDR:
1541 case OP_SUB_INT_2ADDR:
1542 case OP_MUL_INT_2ADDR:
1543 case OP_DIV_INT_2ADDR:
1544 case OP_REM_INT_2ADDR:
1545 case OP_AND_INT_2ADDR:
1546 case OP_OR_INT_2ADDR:
1547 case OP_XOR_INT_2ADDR:
1548 case OP_SHL_INT_2ADDR:
1549 case OP_SHR_INT_2ADDR:
1550 case OP_USHR_INT_2ADDR:
1551 case OP_ADD_LONG_2ADDR:
1552 case OP_SUB_LONG_2ADDR:
1553 case OP_MUL_LONG_2ADDR:
1554 case OP_DIV_LONG_2ADDR:
1555 case OP_REM_LONG_2ADDR:
1556 case OP_AND_LONG_2ADDR:
1557 case OP_OR_LONG_2ADDR:
1558 case OP_XOR_LONG_2ADDR:
1559 case OP_SHL_LONG_2ADDR:
1560 case OP_SHR_LONG_2ADDR:
1561 case OP_USHR_LONG_2ADDR:
1562 case OP_ADD_FLOAT_2ADDR:
1563 case OP_SUB_FLOAT_2ADDR:
1564 case OP_MUL_FLOAT_2ADDR:
1565 case OP_DIV_FLOAT_2ADDR:
1566 case OP_REM_FLOAT_2ADDR:
1567 case OP_ADD_DOUBLE_2ADDR:
1568 case OP_SUB_DOUBLE_2ADDR:
1569 case OP_MUL_DOUBLE_2ADDR:
1570 case OP_DIV_DOUBLE_2ADDR:
1571 case OP_REM_DOUBLE_2ADDR:
1572 case OP_GOTO_16:
1573 case OP_GOTO_32:
1574 case OP_CONST_16:
1575 case OP_CONST_WIDE_16:
1576 case OP_IF_EQZ:
1577 case OP_IF_NEZ:
1578 case OP_IF_LTZ:
1579 case OP_IF_GEZ:
1580 case OP_IF_GTZ:
1581 case OP_IF_LEZ:
1582 case OP_FILL_ARRAY_DATA:
1583 case OP_PACKED_SWITCH:
1584 case OP_SPARSE_SWITCH:
1585 case OP_ADD_INT_LIT8:
1586 case OP_RSUB_INT_LIT8:
1587 case OP_MUL_INT_LIT8:
1588 case OP_DIV_INT_LIT8:
1589 case OP_REM_INT_LIT8:
1590 case OP_AND_INT_LIT8:
1591 case OP_OR_INT_LIT8:
1592 case OP_XOR_INT_LIT8:
1593 case OP_SHL_INT_LIT8:
1594 case OP_SHR_INT_LIT8:
1595 case OP_USHR_INT_LIT8:
1596 case OP_ADD_INT_LIT16:
1597 case OP_RSUB_INT:
1598 case OP_MUL_INT_LIT16:
1599 case OP_DIV_INT_LIT16:
1600 case OP_REM_INT_LIT16:
1601 case OP_AND_INT_LIT16:
1602 case OP_OR_INT_LIT16:
1603 case OP_XOR_INT_LIT16:
1604 case OP_IF_EQ:
1605 case OP_IF_NE:
1606 case OP_IF_LT:
1607 case OP_IF_GE:
1608 case OP_IF_GT:
1609 case OP_IF_LE:
1610 case OP_MOVE_FROM16:
1611 case OP_MOVE_WIDE_FROM16:
1612 case OP_MOVE_OBJECT_FROM16:
1613 case OP_CMPL_FLOAT:
1614 case OP_CMPG_FLOAT:
1615 case OP_CMPL_DOUBLE:
1616 case OP_CMPG_DOUBLE:
1617 case OP_CMP_LONG:
1618 case OP_AGET:
1619 case OP_AGET_WIDE:
1620 case OP_AGET_OBJECT:
1621 case OP_AGET_BOOLEAN:
1622 case OP_AGET_BYTE:
1623 case OP_AGET_CHAR:
1624 case OP_AGET_SHORT:
1625 case OP_APUT:
1626 case OP_APUT_WIDE:
1627 case OP_APUT_OBJECT:
1628 case OP_APUT_BOOLEAN:
1629 case OP_APUT_BYTE:
1630 case OP_APUT_CHAR:
1631 case OP_APUT_SHORT:
1632 case OP_ADD_INT:
1633 case OP_SUB_INT:
1634 case OP_MUL_INT:
1635 case OP_DIV_INT:
1636 case OP_REM_INT:
1637 case OP_AND_INT:
1638 case OP_OR_INT:
1639 case OP_XOR_INT:
1640 case OP_SHL_INT:
1641 case OP_SHR_INT:
1642 case OP_USHR_INT:
1643 case OP_ADD_LONG:
1644 case OP_SUB_LONG:
1645 case OP_MUL_LONG:
1646 case OP_DIV_LONG:
1647 case OP_REM_LONG:
1648 case OP_AND_LONG:
1649 case OP_OR_LONG:
1650 case OP_XOR_LONG:
1651 case OP_SHL_LONG:
1652 case OP_SHR_LONG:
1653 case OP_USHR_LONG:
1654 case OP_ADD_FLOAT:
1655 case OP_SUB_FLOAT:
1656 case OP_MUL_FLOAT:
1657 case OP_DIV_FLOAT:
1658 case OP_REM_FLOAT:
1659 case OP_ADD_DOUBLE:
1660 case OP_SUB_DOUBLE:
1661 case OP_MUL_DOUBLE:
1662 case OP_DIV_DOUBLE:
1663 case OP_REM_DOUBLE:
1664 case OP_CONST:
1665 case OP_CONST_WIDE_32:
1666 case OP_MOVE_16:
1667 case OP_MOVE_WIDE_16:
1668 case OP_MOVE_OBJECT_16:
1669 case OP_CONST_WIDE:
1670 indexType = kIndexNone;
1671 break;
1672 case OP_CONST_STRING:
1673 case OP_CONST_STRING_JUMBO:
1674 indexType = kIndexStringRef;
1675 break;
1676 case OP_CONST_CLASS:
1677 case OP_CHECK_CAST:
1678 case OP_NEW_INSTANCE:
1679 case OP_INSTANCE_OF:
1680 case OP_NEW_ARRAY:
1681 case OP_FILLED_NEW_ARRAY:
1682 case OP_FILLED_NEW_ARRAY_RANGE:
Dan Bornstein1530c3e2010-11-12 12:51:35 -08001683 indexType = kIndexTypeRef;
Dan Bornstein44a38f42010-11-10 17:34:32 -08001684 break;
1685 case OP_SGET:
1686 case OP_SGET_WIDE:
1687 case OP_SGET_OBJECT:
1688 case OP_SGET_BOOLEAN:
1689 case OP_SGET_BYTE:
1690 case OP_SGET_CHAR:
1691 case OP_SGET_SHORT:
1692 case OP_SPUT:
1693 case OP_SPUT_WIDE:
1694 case OP_SPUT_OBJECT:
1695 case OP_SPUT_BOOLEAN:
1696 case OP_SPUT_BYTE:
1697 case OP_SPUT_CHAR:
1698 case OP_SPUT_SHORT:
1699 case OP_IGET:
1700 case OP_IGET_WIDE:
1701 case OP_IGET_OBJECT:
1702 case OP_IGET_BOOLEAN:
1703 case OP_IGET_BYTE:
1704 case OP_IGET_CHAR:
1705 case OP_IGET_SHORT:
1706 case OP_IPUT:
1707 case OP_IPUT_WIDE:
1708 case OP_IPUT_OBJECT:
1709 case OP_IPUT_BOOLEAN:
1710 case OP_IPUT_BYTE:
1711 case OP_IPUT_CHAR:
1712 case OP_IPUT_SHORT:
1713 indexType = kIndexFieldRef;
1714 break;
1715 case OP_INVOKE_VIRTUAL:
1716 case OP_INVOKE_SUPER:
1717 case OP_INVOKE_DIRECT:
1718 case OP_INVOKE_STATIC:
1719 case OP_INVOKE_INTERFACE:
1720 case OP_INVOKE_VIRTUAL_RANGE:
1721 case OP_INVOKE_SUPER_RANGE:
1722 case OP_INVOKE_DIRECT_RANGE:
1723 case OP_INVOKE_STATIC_RANGE:
1724 case OP_INVOKE_INTERFACE_RANGE:
1725 indexType = kIndexMethodRef;
1726 break;
1727
1728 /*
1729 * Optimized instructions.
1730 */
1731 case OP_THROW_VERIFICATION_ERROR:
1732 indexType = kIndexVaries;
1733 break;
1734 case OP_IGET_WIDE_VOLATILE:
1735 case OP_IPUT_WIDE_VOLATILE:
1736 case OP_IGET_VOLATILE:
1737 case OP_IPUT_VOLATILE:
1738 case OP_IGET_OBJECT_VOLATILE:
1739 case OP_IPUT_OBJECT_VOLATILE:
1740 case OP_SGET_OBJECT_VOLATILE:
1741 case OP_SPUT_OBJECT_VOLATILE:
1742 case OP_SGET_VOLATILE:
1743 case OP_SPUT_VOLATILE:
1744 case OP_SGET_WIDE_VOLATILE:
1745 case OP_SPUT_WIDE_VOLATILE:
1746 indexType = kIndexFieldRef;
1747 break;
1748 case OP_IGET_QUICK:
1749 case OP_IGET_WIDE_QUICK:
1750 case OP_IGET_OBJECT_QUICK:
1751 case OP_IPUT_QUICK:
1752 case OP_IPUT_WIDE_QUICK:
1753 case OP_IPUT_OBJECT_QUICK:
1754 indexType = kIndexFieldOffset;
1755 break;
1756 case OP_INVOKE_VIRTUAL_QUICK:
1757 case OP_INVOKE_SUPER_QUICK:
1758 case OP_INVOKE_VIRTUAL_QUICK_RANGE:
1759 case OP_INVOKE_SUPER_QUICK_RANGE:
1760 indexType = kIndexVtableOffset;
1761 break;
1762 case OP_EXECUTE_INLINE:
1763 case OP_EXECUTE_INLINE_RANGE:
1764 indexType = kIndexInlineMethod;
1765 break;
1766 case OP_INVOKE_DIRECT_EMPTY:
1767 indexType = kIndexMethodRef;
1768 break;
1769 case OP_RETURN_VOID_BARRIER:
1770 indexType = kIndexNone;
1771 break;
1772
1773 /* these should never appear when scanning code */
1774 case OP_UNUSED_3E:
1775 case OP_UNUSED_3F:
1776 case OP_UNUSED_40:
1777 case OP_UNUSED_41:
1778 case OP_UNUSED_42:
1779 case OP_UNUSED_43:
1780 case OP_UNUSED_73:
1781 case OP_UNUSED_79:
1782 case OP_UNUSED_7A:
1783 case OP_BREAKPOINT:
1784 case OP_UNUSED_FF:
1785 indexType = kIndexUnknown;
1786 break;
1787
1788 /*
1789 * DO NOT add a "default" clause here. Without it the compiler will
1790 * complain if an instruction is missing (which is desirable).
1791 */
1792 }
1793
1794 indexTypes[opc] = indexType;
1795 }
1796
1797 return indexTypes;
1798}
1799
1800/*
1801 * Construct all of the instruction info tables, storing references to
1802 * them into the given struct. This returns 0 on success or non-zero on
1803 * failure. If this fails, then no net allocation will have occurred.
1804 */
1805int dexCreateInstructionInfoTables(InstructionInfoTables* info) {
1806 info->formats = NULL;
1807 info->indexTypes = NULL;
1808 info->flags = NULL;
1809 info->widths = NULL;
1810
1811 info->formats = dexCreateInstrFormatTable();
1812 info->indexTypes = dexCreateInstrIndexTypeTable();
1813 info->flags = dexCreateInstrFlagsTable();
1814 info->widths = dexCreateInstrWidthTable();
1815
1816 if ((info->formats == NULL)
1817 || (info->indexTypes == NULL)
1818 || (info->flags == NULL)
1819 || (info->widths == NULL)) {
1820 dexFreeInstructionInfoTables(info);
1821 return 1;
1822 }
1823
1824 return 0;
1825}
1826
1827/*
1828 * Free up the tables referred to by the given instruction info struct.
1829 */
1830void dexFreeInstructionInfoTables(InstructionInfoTables* info) {
1831 free(info->formats);
1832 free(info->indexTypes);
1833 free(info->flags);
1834 free(info->widths);
1835}
1836
1837/*
1838 * Handy macros for helping decode instructions.
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001839 */
1840#define FETCH(_offset) (insns[(_offset)])
Dan Bornstein44a38f42010-11-10 17:34:32 -08001841#define FETCH_u4(_offset) (fetch_u4_impl((_offset), insns))
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001842#define INST_INST(_inst) ((_inst) & 0xff)
1843#define INST_A(_inst) (((u2)(_inst) >> 8) & 0x0f)
1844#define INST_B(_inst) ((u2)(_inst) >> 12)
1845#define INST_AA(_inst) ((_inst) >> 8)
1846
Dan Bornstein44a38f42010-11-10 17:34:32 -08001847/* Helper for FETCH_u4, above. */
1848static inline u4 fetch_u4_impl(u4 offset, const u2* insns) {
1849 return insns[offset] | ((u4) insns[offset+1] << 16);
1850}
1851
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001852/*
1853 * Decode the instruction pointed to by "insns".
1854 *
1855 * Fills out the pieces of "pDec" that are affected by the current
1856 * instruction. Does not touch anything else.
1857 */
Dan Bornstein44a38f42010-11-10 17:34:32 -08001858void dexDecodeInstruction(const InstructionInfoTables* info, const u2* insns,
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001859 DecodedInstruction* pDec)
1860{
1861 u2 inst = *insns;
Dan Bornsteinff70f762010-11-10 11:26:52 -08001862 OpCode opCode = (OpCode) INST_INST(inst);
Dan Bornstein44a38f42010-11-10 17:34:32 -08001863 InstructionFormat format = dexGetInstrFormat(info->formats, opCode);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001864
Dan Bornsteinff70f762010-11-10 11:26:52 -08001865 pDec->opCode = opCode;
Dan Bornstein44a38f42010-11-10 17:34:32 -08001866 pDec->indexType = dexGetInstrIndexType(info->indexTypes, opCode);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001867
Dan Bornsteinff70f762010-11-10 11:26:52 -08001868 switch (format) {
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001869 case kFmt10x: // op
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001870 /* nothing to do; copy the AA bits out for the verifier */
1871 pDec->vA = INST_AA(inst);
1872 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001873 case kFmt12x: // op vA, vB
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001874 pDec->vA = INST_A(inst);
1875 pDec->vB = INST_B(inst);
1876 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001877 case kFmt11n: // op vA, #+B
Carl Shapirode750892010-06-08 16:37:12 -07001878 pDec->vA = INST_A(inst);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001879 pDec->vB = (s4) (INST_B(inst) << 28) >> 28; // sign extend 4-bit value
1880 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001881 case kFmt11x: // op vAA
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001882 pDec->vA = INST_AA(inst);
1883 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001884 case kFmt10t: // op +AA
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001885 pDec->vA = (s1) INST_AA(inst); // sign-extend 8-bit value
1886 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001887 case kFmt20t: // op +AAAA
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001888 pDec->vA = (s2) FETCH(1); // sign-extend 16-bit value
1889 break;
Andy McFaddend3250112010-11-03 14:32:42 -07001890 case kFmt20bc: // [opt] op AA, thing@BBBB
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001891 case kFmt21c: // op vAA, thing@BBBB
1892 case kFmt22x: // op vAA, vBBBB
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001893 pDec->vA = INST_AA(inst);
1894 pDec->vB = FETCH(1);
1895 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001896 case kFmt21s: // op vAA, #+BBBB
1897 case kFmt21t: // op vAA, +BBBB
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001898 pDec->vA = INST_AA(inst);
1899 pDec->vB = (s2) FETCH(1); // sign-extend 16-bit value
1900 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001901 case kFmt21h: // op vAA, #+BBBB0000[00000000]
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001902 pDec->vA = INST_AA(inst);
1903 /*
1904 * The value should be treated as right-zero-extended, but we don't
1905 * actually do that here. Among other things, we don't know if it's
1906 * the top bits of a 32- or 64-bit value.
1907 */
1908 pDec->vB = FETCH(1);
1909 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001910 case kFmt23x: // op vAA, vBB, vCC
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001911 pDec->vA = INST_AA(inst);
1912 pDec->vB = FETCH(1) & 0xff;
1913 pDec->vC = FETCH(1) >> 8;
1914 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001915 case kFmt22b: // op vAA, vBB, #+CC
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001916 pDec->vA = INST_AA(inst);
1917 pDec->vB = FETCH(1) & 0xff;
1918 pDec->vC = (s1) (FETCH(1) >> 8); // sign-extend 8-bit value
1919 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001920 case kFmt22s: // op vA, vB, #+CCCC
1921 case kFmt22t: // op vA, vB, +CCCC
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001922 pDec->vA = INST_A(inst);
1923 pDec->vB = INST_B(inst);
1924 pDec->vC = (s2) FETCH(1); // sign-extend 16-bit value
1925 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001926 case kFmt22c: // op vA, vB, thing@CCCC
1927 case kFmt22cs: // [opt] op vA, vB, field offset CCCC
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001928 pDec->vA = INST_A(inst);
1929 pDec->vB = INST_B(inst);
1930 pDec->vC = FETCH(1);
1931 break;
Dan Bornsteinff70f762010-11-10 11:26:52 -08001932 case kFmt30t: // op +AAAAAAAA
Dan Bornstein44a38f42010-11-10 17:34:32 -08001933 pDec->vA = FETCH_u4(1); // signed 32-bit value
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001934 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001935 case kFmt31t: // op vAA, +BBBBBBBB
Andy McFaddend3250112010-11-03 14:32:42 -07001936 case kFmt31c: // op vAA, string@BBBBBBBB
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001937 pDec->vA = INST_AA(inst);
Dan Bornstein44a38f42010-11-10 17:34:32 -08001938 pDec->vB = FETCH_u4(1); // 32-bit value
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001939 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001940 case kFmt32x: // op vAAAA, vBBBB
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001941 pDec->vA = FETCH(1);
1942 pDec->vB = FETCH(2);
1943 break;
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001944 case kFmt31i: // op vAA, #+BBBBBBBB
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001945 pDec->vA = INST_AA(inst);
Dan Bornstein44a38f42010-11-10 17:34:32 -08001946 pDec->vB = FETCH_u4(1); // signed 32-bit value
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001947 break;
Dan Bornstein7b3e9b02010-11-09 17:15:10 -08001948 case kFmt35c: // op {vC, vD, vE, vF, vG}, thing@BBBB
Andy McFadden3a1aedb2009-05-07 13:30:23 -07001949 case kFmt35ms: // [opt] invoke-virtual+super
Dan Bornsteinff70f762010-11-10 11:26:52 -08001950 case kFmt35mi: // [opt] inline invoke
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001951 {
1952 /*
Dan Bornstein7b3e9b02010-11-09 17:15:10 -08001953 * Note that the fields mentioned in the spec don't appear in
1954 * their "usual" positions here compared to most formats. This
1955 * was done so that the field names for the argument count and
1956 * reference index match between this format and the corresponding
1957 * range formats (3rc and friends).
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001958 *
Dan Bornstein7b3e9b02010-11-09 17:15:10 -08001959 * Bottom line: The argument count is always in vA, and the
Dan Bornsteinff70f762010-11-10 11:26:52 -08001960 * method constant (or equivalent) is always in vB.
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001961 */
1962 u2 regList;
1963 int i, count;
1964
Dan Bornstein7b3e9b02010-11-09 17:15:10 -08001965 pDec->vA = INST_B(inst); // This is labeled A in the spec.
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001966 pDec->vB = FETCH(1);
1967 regList = FETCH(2);
1968
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001969 count = pDec->vA;
Dan Bornsteinff70f762010-11-10 11:26:52 -08001970
1971 /*
1972 * Copy the argument registers into the arg[] array, and
1973 * also copy the first argument (if any) into vC. (The
1974 * DecodedInstruction structure doesn't have separate
1975 * fields for {vD, vE, vF, vG}, so there's no need to make
1976 * copies of those.) Note that cases 5..2 fall through.
1977 */
1978 switch (count) {
1979 case 5: {
1980 if (format == kFmt35mi) {
1981 /* A fifth arg is verboten for inline invokes. */
1982 LOGW("Invalid arg count in 35mi (5)\n");
1983 goto bail;
1984 }
Dan Bornstein7b3e9b02010-11-09 17:15:10 -08001985 /*
Dan Bornsteinff70f762010-11-10 11:26:52 -08001986 * Per note at the top of this format decoder, the
1987 * fifth argument comes from the A field in the
Dan Bornstein7b3e9b02010-11-09 17:15:10 -08001988 * instruction, but it's labeled G in the spec.
1989 */
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001990 pDec->arg[4] = INST_A(inst);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001991 }
Dan Bornsteinff70f762010-11-10 11:26:52 -08001992 case 4: pDec->arg[3] = (regList >> 12) & 0x0f;
1993 case 3: pDec->arg[2] = (regList >> 8) & 0x0f;
1994 case 2: pDec->arg[1] = (regList >> 4) & 0x0f;
1995 case 1: pDec->vC = pDec->arg[0] = regList & 0x0f; break;
1996 case 0: break; // Valid, but no need to do anything.
1997 default:
1998 LOGW("Invalid arg count in 35c/35ms/35mi (%d)\n", count);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001999 goto bail;
2000 }
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08002001 }
2002 break;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08002003 case kFmt3rc: // op {vCCCC .. v(CCCC+AA-1)}, meth@BBBB
2004 case kFmt3rms: // [opt] invoke-virtual+super/range
Dan Bornstein7b3e9b02010-11-09 17:15:10 -08002005 case kFmt3rmi: // [opt] execute-inline/range
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08002006 pDec->vA = INST_AA(inst);
2007 pDec->vB = FETCH(1);
2008 pDec->vC = FETCH(2);
2009 break;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08002010 case kFmt51l: // op vAA, #+BBBBBBBBBBBBBBBB
2011 pDec->vA = INST_AA(inst);
Dan Bornstein44a38f42010-11-10 17:34:32 -08002012 pDec->vB_wide = FETCH_u4(1) | ((u8) FETCH_u4(3) << 32);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08002013 break;
Dan Bornstein4a6b4822010-11-11 12:26:58 -08002014 case kFmt33x: // exop vAA, vBB, vCCCC
2015 pDec->vA = FETCH(1) & 0xff;
2016 pDec->vB = FETCH(1) >> 8;
2017 pDec->vC = FETCH(2);
2018 break;
2019 case kFmt32s: // exop vAA, vBB, #+CCCC
2020 pDec->vA = FETCH(1) & 0xff;
2021 pDec->vB = FETCH(1) >> 8;
2022 pDec->vC = (s2) FETCH(2); // sign-extend 16-bit value
2023 break;
2024 case kFmt41c: // exop vAAAA, thing@BBBBBBBB
2025 /*
2026 * The order of fields for this format in the spec is {B, A},
2027 * to match formats 21c and 31c.
2028 */
2029 pDec->vB = FETCH_u4(1); // 32-bit value
2030 pDec->vA = FETCH(3);
2031 break;
2032 case kFmt52c: // exop vAAAA, vBBBB, thing@CCCCCCCC
2033 /*
2034 * The order of fields for this format in the spec is {C, A, B},
2035 * to match formats 22c and 22cs.
2036 */
2037 pDec->vC = FETCH_u4(1); // 32-bit value
2038 pDec->vA = FETCH(3);
2039 pDec->vB = FETCH(4);
2040 break;
2041 case kFmt5rc: // exop {vCCCC .. v(CCCC+AAAA-1)}, meth@BBBBBBBB
2042 /*
2043 * The order of fields for this format in the spec is {B, A, C},
2044 * to match formats 3rc and friends.
2045 */
2046 pDec->vB = FETCH_u4(1); // 32-bit value
2047 pDec->vA = FETCH(3);
2048 pDec->vC = FETCH(4);
2049 break;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08002050 default:
Dan Bornsteinff70f762010-11-10 11:26:52 -08002051 LOGW("Can't decode unexpected format %d (op=%d)\n", format, opCode);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08002052 assert(false);
2053 break;
2054 }
2055
2056bail:
2057 ;
2058}
2059
2060/*
2061 * Return the width of the specified instruction, or 0 if not defined. Also
2062 * works for special OP_NOP entries, including switch statement data tables
2063 * and array data.
2064 */
Andy McFaddena0929372010-11-11 16:49:22 -08002065size_t dexGetInstrOrTableWidth(const InstructionWidth* widths,
Andy McFadden228a6b02010-05-04 15:02:32 -07002066 const u2* insns)
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08002067{
Andy McFadden228a6b02010-05-04 15:02:32 -07002068 size_t width;
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08002069
2070 if (*insns == kPackedSwitchSignature) {
2071 width = 4 + insns[1] * 2;
2072 } else if (*insns == kSparseSwitchSignature) {
2073 width = 2 + insns[1] * 4;
2074 } else if (*insns == kArrayDataSignature) {
2075 u2 elemWidth = insns[1];
2076 u4 len = insns[2] | (((u4)insns[3]) << 16);
2077 width = 4 + (elemWidth * len + 1) / 2;
2078 } else {
Andy McFaddena0929372010-11-11 16:49:22 -08002079 width = dexGetInstrWidth(widths, INST_INST(insns[0]));
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08002080 }
2081 return width;
2082}