2 * Copyright (C) 2008 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * Dalvik instruction utility functions.
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.
25 #include "InstrUtils.h"
29 * Table that maps each opcode to the full width of instructions that
30 * use that opcode, in (16-bit) code units. Unimplemented opcodes as
31 * well as the "breakpoint" opcode have a width of zero.
33 static InstructionWidth gInstructionWidthTable[kNumPackedOpcodes] = {
34 // BEGIN(libdex-widths); GENERATED AUTOMATICALLY BY opcode-gen
35 1, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 1, 1, 1, 1,
36 1, 1, 1, 2, 3, 2, 2, 3, 5, 2, 2, 3, 2, 1, 1, 2,
37 2, 1, 2, 2, 3, 3, 3, 1, 1, 2, 3, 3, 3, 2, 2, 2,
38 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,
39 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
40 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
41 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3,
42 3, 3, 3, 0, 3, 3, 3, 3, 3, 0, 0, 1, 1, 1, 1, 1,
43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
45 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
47 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
48 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
49 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 3, 3,
50 3, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 0,
51 4, 4, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
52 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
53 4, 4, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
54 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
55 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
57 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
59 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
61 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
62 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
65 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66 0, 0, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4,
71 * Table that maps each opcode to the flags associated with that
74 static u1 gOpcodeFlagsTable[kNumPackedOpcodes] = {
75 // BEGIN(libdex-flags); GENERATED AUTOMATICALLY BY opcode-gen
102 kInstrCanContinue|kInstrCanThrow,
103 kInstrCanContinue|kInstrCanThrow,
104 kInstrCanContinue|kInstrCanThrow,
105 kInstrCanContinue|kInstrCanThrow,
106 kInstrCanContinue|kInstrCanThrow,
107 kInstrCanContinue|kInstrCanThrow,
108 kInstrCanContinue|kInstrCanThrow,
109 kInstrCanContinue|kInstrCanThrow,
110 kInstrCanContinue|kInstrCanThrow,
111 kInstrCanContinue|kInstrCanThrow,
112 kInstrCanContinue|kInstrCanThrow,
113 kInstrCanContinue|kInstrCanThrow,
119 kInstrCanContinue|kInstrCanSwitch,
120 kInstrCanContinue|kInstrCanSwitch,
126 kInstrCanContinue|kInstrCanBranch,
127 kInstrCanContinue|kInstrCanBranch,
128 kInstrCanContinue|kInstrCanBranch,
129 kInstrCanContinue|kInstrCanBranch,
130 kInstrCanContinue|kInstrCanBranch,
131 kInstrCanContinue|kInstrCanBranch,
132 kInstrCanContinue|kInstrCanBranch,
133 kInstrCanContinue|kInstrCanBranch,
134 kInstrCanContinue|kInstrCanBranch,
135 kInstrCanContinue|kInstrCanBranch,
136 kInstrCanContinue|kInstrCanBranch,
137 kInstrCanContinue|kInstrCanBranch,
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,
174 kInstrCanContinue|kInstrCanThrow,
175 kInstrCanContinue|kInstrCanThrow,
176 kInstrCanContinue|kInstrCanThrow,
177 kInstrCanContinue|kInstrCanThrow,
178 kInstrCanContinue|kInstrCanThrow,
179 kInstrCanContinue|kInstrCanThrow,
180 kInstrCanContinue|kInstrCanThrow,
181 kInstrCanContinue|kInstrCanThrow,
182 kInstrCanContinue|kInstrCanThrow,
183 kInstrCanContinue|kInstrCanThrow,
184 kInstrCanContinue|kInstrCanThrow,
185 kInstrCanContinue|kInstrCanThrow,
186 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
187 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
188 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
189 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
190 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
192 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
193 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
194 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
195 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
196 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
223 kInstrCanContinue|kInstrCanThrow,
224 kInstrCanContinue|kInstrCanThrow,
234 kInstrCanContinue|kInstrCanThrow,
235 kInstrCanContinue|kInstrCanThrow,
255 kInstrCanContinue|kInstrCanThrow,
256 kInstrCanContinue|kInstrCanThrow,
266 kInstrCanContinue|kInstrCanThrow,
267 kInstrCanContinue|kInstrCanThrow,
287 kInstrCanContinue|kInstrCanThrow,
288 kInstrCanContinue|kInstrCanThrow,
295 kInstrCanContinue|kInstrCanThrow,
296 kInstrCanContinue|kInstrCanThrow,
303 kInstrCanContinue|kInstrCanThrow,
304 kInstrCanContinue|kInstrCanThrow,
305 kInstrCanContinue|kInstrCanThrow,
306 kInstrCanContinue|kInstrCanThrow,
307 kInstrCanContinue|kInstrCanThrow,
308 kInstrCanContinue|kInstrCanThrow,
309 kInstrCanContinue|kInstrCanThrow,
310 kInstrCanContinue|kInstrCanThrow,
311 kInstrCanContinue|kInstrCanThrow,
314 kInstrCanContinue|kInstrCanThrow,
315 kInstrCanContinue|kInstrCanThrow,
316 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
318 kInstrCanContinue|kInstrCanThrow,
319 kInstrCanContinue|kInstrCanThrow,
320 kInstrCanContinue|kInstrCanThrow,
321 kInstrCanContinue|kInstrCanThrow,
322 kInstrCanContinue|kInstrCanThrow,
323 kInstrCanContinue|kInstrCanThrow,
324 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
325 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
326 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
327 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
328 kInstrCanContinue|kInstrCanThrow,
329 kInstrCanContinue|kInstrCanThrow,
330 kInstrCanContinue|kInstrCanThrow,
332 kInstrCanContinue|kInstrCanThrow,
333 kInstrCanContinue|kInstrCanThrow,
334 kInstrCanContinue|kInstrCanThrow,
335 kInstrCanContinue|kInstrCanThrow,
336 kInstrCanContinue|kInstrCanThrow,
337 kInstrCanContinue|kInstrCanThrow,
338 kInstrCanContinue|kInstrCanThrow,
339 kInstrCanContinue|kInstrCanThrow,
340 kInstrCanContinue|kInstrCanThrow,
341 kInstrCanContinue|kInstrCanThrow,
342 kInstrCanContinue|kInstrCanThrow,
343 kInstrCanContinue|kInstrCanThrow,
344 kInstrCanContinue|kInstrCanThrow,
345 kInstrCanContinue|kInstrCanThrow,
346 kInstrCanContinue|kInstrCanThrow,
347 kInstrCanContinue|kInstrCanThrow,
348 kInstrCanContinue|kInstrCanThrow,
349 kInstrCanContinue|kInstrCanThrow,
350 kInstrCanContinue|kInstrCanThrow,
351 kInstrCanContinue|kInstrCanThrow,
352 kInstrCanContinue|kInstrCanThrow,
353 kInstrCanContinue|kInstrCanThrow,
354 kInstrCanContinue|kInstrCanThrow,
355 kInstrCanContinue|kInstrCanThrow,
356 kInstrCanContinue|kInstrCanThrow,
357 kInstrCanContinue|kInstrCanThrow,
358 kInstrCanContinue|kInstrCanThrow,
359 kInstrCanContinue|kInstrCanThrow,
360 kInstrCanContinue|kInstrCanThrow,
361 kInstrCanContinue|kInstrCanThrow,
362 kInstrCanContinue|kInstrCanThrow,
363 kInstrCanContinue|kInstrCanThrow,
364 kInstrCanContinue|kInstrCanThrow,
365 kInstrCanContinue|kInstrCanThrow,
366 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
367 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
368 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
369 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
370 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
574 kInstrCanContinue|kInstrCanThrow|kInstrInvoke,
575 kInstrCanContinue|kInstrCanThrow,
576 kInstrCanContinue|kInstrCanThrow,
577 kInstrCanContinue|kInstrCanThrow,
578 kInstrCanContinue|kInstrCanThrow,
579 kInstrCanContinue|kInstrCanThrow,
580 kInstrCanContinue|kInstrCanThrow,
581 kInstrCanContinue|kInstrCanThrow,
582 kInstrCanContinue|kInstrCanThrow,
583 kInstrCanContinue|kInstrCanThrow,
584 kInstrCanContinue|kInstrCanThrow,
585 kInstrCanContinue|kInstrCanThrow,
586 kInstrCanContinue|kInstrCanThrow,
592 * Table that maps each opcode to the instruction format associated
595 static u1 gInstructionFormatTable[kNumPackedOpcodes] = {
596 // BEGIN(libdex-formats); GENERATED AUTOMATICALLY BY opcode-gen
597 kFmt10x, kFmt12x, kFmt22x, kFmt32x, kFmt12x, kFmt22x, kFmt32x,
598 kFmt12x, kFmt22x, kFmt32x, kFmt11x, kFmt11x, kFmt11x, kFmt11x,
599 kFmt10x, kFmt11x, kFmt11x, kFmt11x, kFmt11n, kFmt21s, kFmt31i,
600 kFmt21h, kFmt21s, kFmt31i, kFmt51l, kFmt21h, kFmt21c, kFmt31c,
601 kFmt21c, kFmt11x, kFmt11x, kFmt21c, kFmt22c, kFmt12x, kFmt21c,
602 kFmt22c, kFmt35c, kFmt3rc, kFmt31t, kFmt11x, kFmt10t, kFmt20t,
603 kFmt30t, kFmt31t, kFmt31t, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
604 kFmt23x, kFmt22t, kFmt22t, kFmt22t, kFmt22t, kFmt22t, kFmt22t,
605 kFmt21t, kFmt21t, kFmt21t, kFmt21t, kFmt21t, kFmt21t, kFmt00x,
606 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt23x, kFmt23x,
607 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
608 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt22c, kFmt22c,
609 kFmt22c, kFmt22c, kFmt22c, kFmt22c, kFmt22c, kFmt22c, kFmt22c,
610 kFmt22c, kFmt22c, kFmt22c, kFmt22c, kFmt22c, kFmt21c, kFmt21c,
611 kFmt21c, kFmt21c, kFmt21c, kFmt21c, kFmt21c, kFmt21c, kFmt21c,
612 kFmt21c, kFmt21c, kFmt21c, kFmt21c, kFmt21c, kFmt35c, kFmt35c,
613 kFmt35c, kFmt35c, kFmt35c, kFmt00x, kFmt3rc, kFmt3rc, kFmt3rc,
614 kFmt3rc, kFmt3rc, kFmt00x, kFmt00x, kFmt12x, kFmt12x, kFmt12x,
615 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
616 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
617 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt23x, kFmt23x, kFmt23x,
618 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
619 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
620 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
621 kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x, kFmt23x,
622 kFmt23x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
623 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
624 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
625 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x,
626 kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt12x, kFmt22s, kFmt22s,
627 kFmt22s, kFmt22s, kFmt22s, kFmt22s, kFmt22s, kFmt22s, kFmt22b,
628 kFmt22b, kFmt22b, kFmt22b, kFmt22b, kFmt22b, kFmt22b, kFmt22b,
629 kFmt22b, kFmt22b, kFmt22b, kFmt22c, kFmt22c, kFmt21c, kFmt21c,
630 kFmt22c, kFmt22c, kFmt22c, kFmt21c, kFmt21c, kFmt00x, kFmt20bc,
631 kFmt35mi, kFmt3rmi, kFmt35c, kFmt10x, kFmt22cs, kFmt22cs, kFmt22cs,
632 kFmt22cs, kFmt22cs, kFmt22cs, kFmt35ms, kFmt3rms, kFmt35ms, kFmt3rms,
633 kFmt22c, kFmt21c, kFmt21c, kFmt00x, kFmt41c, kFmt41c, kFmt52c,
634 kFmt41c, kFmt52c, kFmt5rc, kFmt52c, kFmt52c, kFmt52c, kFmt52c,
635 kFmt52c, kFmt52c, kFmt52c, kFmt52c, kFmt52c, kFmt52c, kFmt52c,
636 kFmt52c, kFmt52c, kFmt52c, kFmt41c, kFmt41c, kFmt41c, kFmt41c,
637 kFmt41c, kFmt41c, kFmt41c, kFmt41c, kFmt41c, kFmt41c, kFmt41c,
638 kFmt41c, kFmt41c, kFmt41c, kFmt5rc, kFmt5rc, kFmt5rc, kFmt5rc,
639 kFmt5rc, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
640 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
641 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
642 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
643 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
644 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
645 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
646 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
647 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
648 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
649 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
650 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
651 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
652 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
653 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
654 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
655 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
656 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
657 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
658 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
659 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
660 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
661 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
662 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
663 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
664 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
665 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
666 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
667 kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x, kFmt00x,
668 kFmt00x, kFmt5rc, kFmt52c, kFmt52c, kFmt52c, kFmt52c, kFmt52c,
669 kFmt52c, kFmt41c, kFmt41c, kFmt41c, kFmt41c, kFmt41c, kFmt41c,
671 // END(libdex-formats)
675 * Table that maps each opcode to the index type implied by that
678 static u1 gInstructionIndexTypeTable[kNumPackedOpcodes] = {
679 // BEGIN(libdex-index-types); GENERATED AUTOMATICALLY BY opcode-gen
680 kIndexNone, kIndexNone, kIndexNone,
681 kIndexNone, kIndexNone, kIndexNone,
682 kIndexNone, kIndexNone, kIndexNone,
683 kIndexNone, kIndexNone, kIndexNone,
684 kIndexNone, kIndexNone, kIndexNone,
685 kIndexNone, kIndexNone, kIndexNone,
686 kIndexNone, kIndexNone, kIndexNone,
687 kIndexNone, kIndexNone, kIndexNone,
688 kIndexNone, kIndexNone, kIndexStringRef,
689 kIndexStringRef, kIndexTypeRef, kIndexNone,
690 kIndexNone, kIndexTypeRef, kIndexTypeRef,
691 kIndexNone, kIndexTypeRef, kIndexTypeRef,
692 kIndexTypeRef, kIndexTypeRef, kIndexNone,
693 kIndexNone, kIndexNone, kIndexNone,
694 kIndexNone, kIndexNone, kIndexNone,
695 kIndexNone, kIndexNone, kIndexNone,
696 kIndexNone, kIndexNone, kIndexNone,
697 kIndexNone, kIndexNone, kIndexNone,
698 kIndexNone, kIndexNone, kIndexNone,
699 kIndexNone, kIndexNone, kIndexNone,
700 kIndexNone, kIndexNone, kIndexUnknown,
701 kIndexUnknown, kIndexUnknown, kIndexUnknown,
702 kIndexUnknown, kIndexUnknown, kIndexNone,
703 kIndexNone, kIndexNone, kIndexNone,
704 kIndexNone, kIndexNone, kIndexNone,
705 kIndexNone, kIndexNone, kIndexNone,
706 kIndexNone, kIndexNone, kIndexNone,
707 kIndexNone, kIndexFieldRef, kIndexFieldRef,
708 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
709 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
710 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
711 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
712 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
713 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
714 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
715 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
716 kIndexFieldRef, kIndexFieldRef, kIndexMethodRef,
717 kIndexMethodRef, kIndexMethodRef, kIndexMethodRef,
718 kIndexMethodRef, kIndexUnknown, kIndexMethodRef,
719 kIndexMethodRef, kIndexMethodRef, kIndexMethodRef,
720 kIndexMethodRef, kIndexUnknown, kIndexUnknown,
721 kIndexNone, kIndexNone, kIndexNone,
722 kIndexNone, kIndexNone, kIndexNone,
723 kIndexNone, kIndexNone, kIndexNone,
724 kIndexNone, kIndexNone, kIndexNone,
725 kIndexNone, kIndexNone, kIndexNone,
726 kIndexNone, kIndexNone, kIndexNone,
727 kIndexNone, kIndexNone, kIndexNone,
728 kIndexNone, kIndexNone, kIndexNone,
729 kIndexNone, kIndexNone, kIndexNone,
730 kIndexNone, kIndexNone, kIndexNone,
731 kIndexNone, kIndexNone, kIndexNone,
732 kIndexNone, kIndexNone, kIndexNone,
733 kIndexNone, kIndexNone, kIndexNone,
734 kIndexNone, kIndexNone, kIndexNone,
735 kIndexNone, kIndexNone, kIndexNone,
736 kIndexNone, kIndexNone, kIndexNone,
737 kIndexNone, kIndexNone, kIndexNone,
738 kIndexNone, kIndexNone, kIndexNone,
739 kIndexNone, kIndexNone, kIndexNone,
740 kIndexNone, kIndexNone, kIndexNone,
741 kIndexNone, kIndexNone, kIndexNone,
742 kIndexNone, kIndexNone, kIndexNone,
743 kIndexNone, kIndexNone, kIndexNone,
744 kIndexNone, kIndexNone, kIndexNone,
745 kIndexNone, kIndexNone, kIndexNone,
746 kIndexNone, kIndexNone, kIndexNone,
747 kIndexNone, kIndexNone, kIndexNone,
748 kIndexNone, kIndexNone, kIndexNone,
749 kIndexNone, kIndexNone, kIndexNone,
750 kIndexNone, kIndexNone, kIndexNone,
751 kIndexNone, kIndexNone, kIndexNone,
752 kIndexNone, kIndexNone, kIndexNone,
753 kIndexNone, kIndexNone, kIndexNone,
754 kIndexNone, kIndexNone, kIndexNone,
755 kIndexNone, kIndexNone, kIndexFieldRef,
756 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
757 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
758 kIndexFieldRef, kIndexFieldRef, kIndexUnknown,
759 kIndexVaries, kIndexInlineMethod, kIndexInlineMethod,
760 kIndexMethodRef, kIndexNone, kIndexFieldOffset,
761 kIndexFieldOffset, kIndexFieldOffset, kIndexFieldOffset,
762 kIndexFieldOffset, kIndexFieldOffset, kIndexVtableOffset,
763 kIndexVtableOffset, kIndexVtableOffset, kIndexVtableOffset,
764 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
765 kIndexUnknown, kIndexTypeRef, kIndexTypeRef,
766 kIndexTypeRef, kIndexTypeRef, kIndexTypeRef,
767 kIndexTypeRef, kIndexFieldRef, kIndexFieldRef,
768 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
769 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
770 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
771 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
772 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
773 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
774 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
775 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
776 kIndexFieldRef, kIndexFieldRef, kIndexMethodRef,
777 kIndexMethodRef, kIndexMethodRef, kIndexMethodRef,
778 kIndexMethodRef, kIndexUnknown, kIndexUnknown,
779 kIndexUnknown, kIndexUnknown, kIndexUnknown,
780 kIndexUnknown, kIndexUnknown, kIndexUnknown,
781 kIndexUnknown, kIndexUnknown, kIndexUnknown,
782 kIndexUnknown, kIndexUnknown, kIndexUnknown,
783 kIndexUnknown, kIndexUnknown, kIndexUnknown,
784 kIndexUnknown, kIndexUnknown, kIndexUnknown,
785 kIndexUnknown, kIndexUnknown, kIndexUnknown,
786 kIndexUnknown, kIndexUnknown, kIndexUnknown,
787 kIndexUnknown, kIndexUnknown, kIndexUnknown,
788 kIndexUnknown, kIndexUnknown, kIndexUnknown,
789 kIndexUnknown, kIndexUnknown, kIndexUnknown,
790 kIndexUnknown, kIndexUnknown, kIndexUnknown,
791 kIndexUnknown, kIndexUnknown, kIndexUnknown,
792 kIndexUnknown, kIndexUnknown, kIndexUnknown,
793 kIndexUnknown, kIndexUnknown, kIndexUnknown,
794 kIndexUnknown, kIndexUnknown, kIndexUnknown,
795 kIndexUnknown, kIndexUnknown, kIndexUnknown,
796 kIndexUnknown, kIndexUnknown, kIndexUnknown,
797 kIndexUnknown, kIndexUnknown, kIndexUnknown,
798 kIndexUnknown, kIndexUnknown, kIndexUnknown,
799 kIndexUnknown, kIndexUnknown, kIndexUnknown,
800 kIndexUnknown, kIndexUnknown, kIndexUnknown,
801 kIndexUnknown, kIndexUnknown, kIndexUnknown,
802 kIndexUnknown, kIndexUnknown, kIndexUnknown,
803 kIndexUnknown, kIndexUnknown, kIndexUnknown,
804 kIndexUnknown, kIndexUnknown, kIndexUnknown,
805 kIndexUnknown, kIndexUnknown, kIndexUnknown,
806 kIndexUnknown, kIndexUnknown, kIndexUnknown,
807 kIndexUnknown, kIndexUnknown, kIndexUnknown,
808 kIndexUnknown, kIndexUnknown, kIndexUnknown,
809 kIndexUnknown, kIndexUnknown, kIndexUnknown,
810 kIndexUnknown, kIndexUnknown, kIndexUnknown,
811 kIndexUnknown, kIndexUnknown, kIndexUnknown,
812 kIndexUnknown, kIndexUnknown, kIndexUnknown,
813 kIndexUnknown, kIndexUnknown, kIndexUnknown,
814 kIndexUnknown, kIndexUnknown, kIndexUnknown,
815 kIndexUnknown, kIndexUnknown, kIndexUnknown,
816 kIndexUnknown, kIndexUnknown, kIndexUnknown,
817 kIndexUnknown, kIndexUnknown, kIndexUnknown,
818 kIndexUnknown, kIndexUnknown, kIndexUnknown,
819 kIndexUnknown, kIndexUnknown, kIndexUnknown,
820 kIndexUnknown, kIndexUnknown, kIndexUnknown,
821 kIndexUnknown, kIndexUnknown, kIndexUnknown,
822 kIndexUnknown, kIndexUnknown, kIndexUnknown,
823 kIndexUnknown, kIndexUnknown, kIndexUnknown,
824 kIndexUnknown, kIndexUnknown, kIndexUnknown,
825 kIndexUnknown, kIndexUnknown, kIndexUnknown,
826 kIndexUnknown, kIndexUnknown, kIndexUnknown,
827 kIndexUnknown, kIndexUnknown, kIndexUnknown,
828 kIndexUnknown, kIndexUnknown, kIndexUnknown,
829 kIndexUnknown, kIndexUnknown, kIndexUnknown,
830 kIndexUnknown, kIndexUnknown, kIndexUnknown,
831 kIndexUnknown, kIndexUnknown, kIndexUnknown,
832 kIndexUnknown, kIndexUnknown, kIndexUnknown,
833 kIndexUnknown, kIndexUnknown, kIndexUnknown,
834 kIndexUnknown, kIndexUnknown, kIndexUnknown,
835 kIndexUnknown, kIndexUnknown, kIndexUnknown,
836 kIndexUnknown, kIndexUnknown, kIndexUnknown,
837 kIndexUnknown, kIndexUnknown, kIndexUnknown,
838 kIndexUnknown, kIndexUnknown, kIndexUnknown,
839 kIndexUnknown, kIndexUnknown, kIndexUnknown,
840 kIndexUnknown, kIndexUnknown, kIndexUnknown,
841 kIndexUnknown, kIndexUnknown, kIndexUnknown,
842 kIndexUnknown, kIndexUnknown, kIndexUnknown,
843 kIndexUnknown, kIndexUnknown, kIndexUnknown,
844 kIndexUnknown, kIndexUnknown, kIndexUnknown,
845 kIndexUnknown, kIndexUnknown, kIndexUnknown,
846 kIndexMethodRef, kIndexFieldRef, kIndexFieldRef,
847 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
848 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
849 kIndexFieldRef, kIndexFieldRef, kIndexFieldRef,
850 kIndexFieldRef, kIndexVaries,
851 // END(libdex-index-types)
855 * Global InstructionInfoTables struct.
857 InstructionInfoTables gDexOpcodeInfo = {
858 gInstructionFormatTable,
859 gInstructionIndexTypeTable,
861 gInstructionWidthTable
865 * Handy macros for helping decode instructions.
867 #define FETCH(_offset) (insns[(_offset)])
868 #define FETCH_u4(_offset) (fetch_u4_impl((_offset), insns))
869 #define INST_A(_inst) (((u2)(_inst) >> 8) & 0x0f)
870 #define INST_B(_inst) ((u2)(_inst) >> 12)
871 #define INST_AA(_inst) ((_inst) >> 8)
873 /* Helper for FETCH_u4, above. */
874 static inline u4 fetch_u4_impl(u4 offset, const u2* insns) {
875 return insns[offset] | ((u4) insns[offset+1] << 16);
879 * Decode the instruction pointed to by "insns".
881 * Fills out the pieces of "pDec" that are affected by the current
882 * instruction. Does not touch anything else.
884 void dexDecodeInstruction(const u2* insns, DecodedInstruction* pDec)
887 Opcode opcode = dexOpcodeFromCodeUnit(inst);
888 InstructionFormat format = dexGetFormatFromOpcode(opcode);
890 pDec->opcode = opcode;
891 pDec->indexType = dexGetIndexTypeFromOpcode(opcode);
895 /* nothing to do; copy the AA bits out for the verifier */
896 pDec->vA = INST_AA(inst);
898 case kFmt12x: // op vA, vB
899 pDec->vA = INST_A(inst);
900 pDec->vB = INST_B(inst);
902 case kFmt11n: // op vA, #+B
903 pDec->vA = INST_A(inst);
904 pDec->vB = (s4) (INST_B(inst) << 28) >> 28; // sign extend 4-bit value
906 case kFmt11x: // op vAA
907 pDec->vA = INST_AA(inst);
909 case kFmt10t: // op +AA
910 pDec->vA = (s1) INST_AA(inst); // sign-extend 8-bit value
912 case kFmt20t: // op +AAAA
913 pDec->vA = (s2) FETCH(1); // sign-extend 16-bit value
915 case kFmt20bc: // [opt] op AA, thing@BBBB
916 case kFmt21c: // op vAA, thing@BBBB
917 case kFmt22x: // op vAA, vBBBB
918 pDec->vA = INST_AA(inst);
921 case kFmt21s: // op vAA, #+BBBB
922 case kFmt21t: // op vAA, +BBBB
923 pDec->vA = INST_AA(inst);
924 pDec->vB = (s2) FETCH(1); // sign-extend 16-bit value
926 case kFmt21h: // op vAA, #+BBBB0000[00000000]
927 pDec->vA = INST_AA(inst);
929 * The value should be treated as right-zero-extended, but we don't
930 * actually do that here. Among other things, we don't know if it's
931 * the top bits of a 32- or 64-bit value.
935 case kFmt23x: // op vAA, vBB, vCC
936 pDec->vA = INST_AA(inst);
937 pDec->vB = FETCH(1) & 0xff;
938 pDec->vC = FETCH(1) >> 8;
940 case kFmt22b: // op vAA, vBB, #+CC
941 pDec->vA = INST_AA(inst);
942 pDec->vB = FETCH(1) & 0xff;
943 pDec->vC = (s1) (FETCH(1) >> 8); // sign-extend 8-bit value
945 case kFmt22s: // op vA, vB, #+CCCC
946 case kFmt22t: // op vA, vB, +CCCC
947 pDec->vA = INST_A(inst);
948 pDec->vB = INST_B(inst);
949 pDec->vC = (s2) FETCH(1); // sign-extend 16-bit value
951 case kFmt22c: // op vA, vB, thing@CCCC
952 case kFmt22cs: // [opt] op vA, vB, field offset CCCC
953 pDec->vA = INST_A(inst);
954 pDec->vB = INST_B(inst);
957 case kFmt30t: // op +AAAAAAAA
958 pDec->vA = FETCH_u4(1); // signed 32-bit value
960 case kFmt31t: // op vAA, +BBBBBBBB
961 case kFmt31c: // op vAA, string@BBBBBBBB
962 pDec->vA = INST_AA(inst);
963 pDec->vB = FETCH_u4(1); // 32-bit value
965 case kFmt32x: // op vAAAA, vBBBB
969 case kFmt31i: // op vAA, #+BBBBBBBB
970 pDec->vA = INST_AA(inst);
971 pDec->vB = FETCH_u4(1); // signed 32-bit value
973 case kFmt35c: // op {vC, vD, vE, vF, vG}, thing@BBBB
974 case kFmt35ms: // [opt] invoke-virtual+super
975 case kFmt35mi: // [opt] inline invoke
978 * Note that the fields mentioned in the spec don't appear in
979 * their "usual" positions here compared to most formats. This
980 * was done so that the field names for the argument count and
981 * reference index match between this format and the corresponding
982 * range formats (3rc and friends).
984 * Bottom line: The argument count is always in vA, and the
985 * method constant (or equivalent) is always in vB.
990 pDec->vA = INST_B(inst); // This is labeled A in the spec.
997 * Copy the argument registers into the arg[] array, and
998 * also copy the first argument (if any) into vC. (The
999 * DecodedInstruction structure doesn't have separate
1000 * fields for {vD, vE, vF, vG}, so there's no need to make
1001 * copies of those.) Note that cases 5..2 fall through.
1005 if (format == kFmt35mi) {
1006 /* A fifth arg is verboten for inline invokes. */
1007 LOGW("Invalid arg count in 35mi (5)");
1011 * Per note at the top of this format decoder, the
1012 * fifth argument comes from the A field in the
1013 * instruction, but it's labeled G in the spec.
1015 pDec->arg[4] = INST_A(inst);
1017 case 4: pDec->arg[3] = (regList >> 12) & 0x0f;
1018 case 3: pDec->arg[2] = (regList >> 8) & 0x0f;
1019 case 2: pDec->arg[1] = (regList >> 4) & 0x0f;
1020 case 1: pDec->vC = pDec->arg[0] = regList & 0x0f; break;
1021 case 0: break; // Valid, but no need to do anything.
1023 LOGW("Invalid arg count in 35c/35ms/35mi (%d)", count);
1028 case kFmt3rc: // op {vCCCC .. v(CCCC+AA-1)}, meth@BBBB
1029 case kFmt3rms: // [opt] invoke-virtual+super/range
1030 case kFmt3rmi: // [opt] execute-inline/range
1031 pDec->vA = INST_AA(inst);
1032 pDec->vB = FETCH(1);
1033 pDec->vC = FETCH(2);
1035 case kFmt51l: // op vAA, #+BBBBBBBBBBBBBBBB
1036 pDec->vA = INST_AA(inst);
1037 pDec->vB_wide = FETCH_u4(1) | ((u8) FETCH_u4(3) << 32);
1039 case kFmt33x: // exop vAA, vBB, vCCCC
1040 pDec->vA = FETCH(1) & 0xff;
1041 pDec->vB = FETCH(1) >> 8;
1042 pDec->vC = FETCH(2);
1044 case kFmt32s: // exop vAA, vBB, #+CCCC
1045 pDec->vA = FETCH(1) & 0xff;
1046 pDec->vB = FETCH(1) >> 8;
1047 pDec->vC = (s2) FETCH(2); // sign-extend 16-bit value
1049 case kFmt40sc: // [opt] exop AAAA, thing@BBBBBBBB
1050 case kFmt41c: // exop vAAAA, thing@BBBBBBBB
1052 * The order of fields for this format in the spec is {B, A},
1053 * to match formats 21c and 31c.
1055 pDec->vB = FETCH_u4(1); // 32-bit value
1056 pDec->vA = FETCH(3);
1058 case kFmt52c: // exop vAAAA, vBBBB, thing@CCCCCCCC
1060 * The order of fields for this format in the spec is {C, A, B},
1061 * to match formats 22c and 22cs.
1063 pDec->vC = FETCH_u4(1); // 32-bit value
1064 pDec->vA = FETCH(3);
1065 pDec->vB = FETCH(4);
1067 case kFmt5rc: // exop {vCCCC .. v(CCCC+AAAA-1)}, meth@BBBBBBBB
1069 * The order of fields for this format in the spec is {B, A, C},
1070 * to match formats 3rc and friends.
1072 pDec->vB = FETCH_u4(1); // 32-bit value
1073 pDec->vA = FETCH(3);
1074 pDec->vC = FETCH(4);
1077 LOGW("Can't decode unexpected format %d (op=%d)", format, opcode);
1087 * Return the width of the specified instruction, or 0 if not defined. Also
1088 * works for special OP_NOP entries, including switch statement data tables
1091 size_t dexGetWidthFromInstruction(const u2* insns)
1095 if (*insns == kPackedSwitchSignature) {
1096 width = 4 + insns[1] * 2;
1097 } else if (*insns == kSparseSwitchSignature) {
1098 width = 2 + insns[1] * 4;
1099 } else if (*insns == kArrayDataSignature) {
1100 u2 elemWidth = insns[1];
1101 u4 len = insns[2] | (((u4)insns[3]) << 16);
1102 // The plus 1 is to round up for odd size and width.
1103 width = 4 + (elemWidth * len + 1) / 2;
1105 width = dexGetWidthFromOpcode(dexOpcodeFromCodeUnit(insns[0]));