1*795d594fSAndroid Build Coastguard Worker // Copyright (C) 2017 The Android Open Source Project
2*795d594fSAndroid Build Coastguard Worker //
3*795d594fSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*795d594fSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*795d594fSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*795d594fSAndroid Build Coastguard Worker //
7*795d594fSAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*795d594fSAndroid Build Coastguard Worker //
9*795d594fSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*795d594fSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*795d594fSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*795d594fSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*795d594fSAndroid Build Coastguard Worker // limitations under the License.
14*795d594fSAndroid Build Coastguard Worker //
15*795d594fSAndroid Build Coastguard Worker
16*795d594fSAndroid Build Coastguard Worker #include "instruction_decoder.h"
17*795d594fSAndroid Build Coastguard Worker
18*795d594fSAndroid Build Coastguard Worker #include "dex/dex_instruction_list.h"
19*795d594fSAndroid Build Coastguard Worker
20*795d594fSAndroid Build Coastguard Worker #include <android-base/logging.h>
21*795d594fSAndroid Build Coastguard Worker
22*795d594fSAndroid Build Coastguard Worker namespace titrace {
23*795d594fSAndroid Build Coastguard Worker
24*795d594fSAndroid Build Coastguard Worker class ClassInstructionDecoder : public InstructionDecoder {
25*795d594fSAndroid Build Coastguard Worker public:
GetMaximumOpcode()26*795d594fSAndroid Build Coastguard Worker size_t GetMaximumOpcode() override {
27*795d594fSAndroid Build Coastguard Worker return 0xff;
28*795d594fSAndroid Build Coastguard Worker }
29*795d594fSAndroid Build Coastguard Worker
GetName(size_t opcode)30*795d594fSAndroid Build Coastguard Worker const char* GetName(size_t opcode) override {
31*795d594fSAndroid Build Coastguard Worker Bytecode::Opcode op = static_cast<Bytecode::Opcode>(opcode);
32*795d594fSAndroid Build Coastguard Worker return Bytecode::ToString(op);
33*795d594fSAndroid Build Coastguard Worker }
34*795d594fSAndroid Build Coastguard Worker
LocationToOffset(size_t j_location)35*795d594fSAndroid Build Coastguard Worker size_t LocationToOffset(size_t j_location) override {
36*795d594fSAndroid Build Coastguard Worker return j_location;
37*795d594fSAndroid Build Coastguard Worker }
38*795d594fSAndroid Build Coastguard Worker
39*795d594fSAndroid Build Coastguard Worker private:
40*795d594fSAndroid Build Coastguard Worker class Bytecode {
41*795d594fSAndroid Build Coastguard Worker public:
42*795d594fSAndroid Build Coastguard Worker enum Opcode {
43*795d594fSAndroid Build Coastguard Worker // Java bytecode opcodes from 0x00 to 0xFF.
44*795d594fSAndroid Build Coastguard Worker kNop = 0x00,
45*795d594fSAndroid Build Coastguard Worker kAconst_null = 0x01,
46*795d594fSAndroid Build Coastguard Worker kIconst_m1 = 0x02,
47*795d594fSAndroid Build Coastguard Worker kIconst_0 = 0x03,
48*795d594fSAndroid Build Coastguard Worker kIconst_1 = 0x04,
49*795d594fSAndroid Build Coastguard Worker kIconst_2 = 0x05,
50*795d594fSAndroid Build Coastguard Worker kIconst_3 = 0x06,
51*795d594fSAndroid Build Coastguard Worker kIconst_4 = 0x07,
52*795d594fSAndroid Build Coastguard Worker kIconst_5 = 0x08,
53*795d594fSAndroid Build Coastguard Worker kLconst_0 = 0x09,
54*795d594fSAndroid Build Coastguard Worker kLconst_1 = 0x0a,
55*795d594fSAndroid Build Coastguard Worker kFconst_0 = 0x0b,
56*795d594fSAndroid Build Coastguard Worker kFconst_1 = 0x0c,
57*795d594fSAndroid Build Coastguard Worker kFconst_2 = 0x0d,
58*795d594fSAndroid Build Coastguard Worker kDconst_0 = 0x0e,
59*795d594fSAndroid Build Coastguard Worker kDconst_1 = 0x0f,
60*795d594fSAndroid Build Coastguard Worker kBipush = 0x10,
61*795d594fSAndroid Build Coastguard Worker kSipush = 0x11,
62*795d594fSAndroid Build Coastguard Worker kLdc = 0x12,
63*795d594fSAndroid Build Coastguard Worker kLdc_w = 0x13,
64*795d594fSAndroid Build Coastguard Worker kLdc2_w = 0x14,
65*795d594fSAndroid Build Coastguard Worker kIload = 0x15,
66*795d594fSAndroid Build Coastguard Worker kLload = 0x16,
67*795d594fSAndroid Build Coastguard Worker kFload = 0x17,
68*795d594fSAndroid Build Coastguard Worker kDload = 0x18,
69*795d594fSAndroid Build Coastguard Worker kAload = 0x19,
70*795d594fSAndroid Build Coastguard Worker kIload_0 = 0x1a,
71*795d594fSAndroid Build Coastguard Worker kIload_1 = 0x1b,
72*795d594fSAndroid Build Coastguard Worker kIload_2 = 0x1c,
73*795d594fSAndroid Build Coastguard Worker kIload_3 = 0x1d,
74*795d594fSAndroid Build Coastguard Worker kLload_0 = 0x1e,
75*795d594fSAndroid Build Coastguard Worker kLload_1 = 0x1f,
76*795d594fSAndroid Build Coastguard Worker kLload_2 = 0x20,
77*795d594fSAndroid Build Coastguard Worker kLload_3 = 0x21,
78*795d594fSAndroid Build Coastguard Worker kFload_0 = 0x22,
79*795d594fSAndroid Build Coastguard Worker kFload_1 = 0x23,
80*795d594fSAndroid Build Coastguard Worker kFload_2 = 0x24,
81*795d594fSAndroid Build Coastguard Worker kFload_3 = 0x25,
82*795d594fSAndroid Build Coastguard Worker kDload_0 = 0x26,
83*795d594fSAndroid Build Coastguard Worker kDload_1 = 0x27,
84*795d594fSAndroid Build Coastguard Worker kDload_2 = 0x28,
85*795d594fSAndroid Build Coastguard Worker kDload_3 = 0x29,
86*795d594fSAndroid Build Coastguard Worker kAload_0 = 0x2a,
87*795d594fSAndroid Build Coastguard Worker kAload_1 = 0x2b,
88*795d594fSAndroid Build Coastguard Worker kAload_2 = 0x2c,
89*795d594fSAndroid Build Coastguard Worker kAload_3 = 0x2d,
90*795d594fSAndroid Build Coastguard Worker kIaload = 0x2e,
91*795d594fSAndroid Build Coastguard Worker kLaload = 0x2f,
92*795d594fSAndroid Build Coastguard Worker kFaload = 0x30,
93*795d594fSAndroid Build Coastguard Worker kDaload = 0x31,
94*795d594fSAndroid Build Coastguard Worker kAaload = 0x32,
95*795d594fSAndroid Build Coastguard Worker kBaload = 0x33,
96*795d594fSAndroid Build Coastguard Worker kCaload = 0x34,
97*795d594fSAndroid Build Coastguard Worker kSaload = 0x35,
98*795d594fSAndroid Build Coastguard Worker kIstore = 0x36,
99*795d594fSAndroid Build Coastguard Worker kLstore = 0x37,
100*795d594fSAndroid Build Coastguard Worker kFstore = 0x38,
101*795d594fSAndroid Build Coastguard Worker kDstore = 0x39,
102*795d594fSAndroid Build Coastguard Worker kAstore = 0x3a,
103*795d594fSAndroid Build Coastguard Worker kIstore_0 = 0x3b,
104*795d594fSAndroid Build Coastguard Worker kIstore_1 = 0x3c,
105*795d594fSAndroid Build Coastguard Worker kIstore_2 = 0x3d,
106*795d594fSAndroid Build Coastguard Worker kIstore_3 = 0x3e,
107*795d594fSAndroid Build Coastguard Worker kLstore_0 = 0x3f,
108*795d594fSAndroid Build Coastguard Worker kLstore_1 = 0x40,
109*795d594fSAndroid Build Coastguard Worker kLstore_2 = 0x41,
110*795d594fSAndroid Build Coastguard Worker kLstore_3 = 0x42,
111*795d594fSAndroid Build Coastguard Worker kFstore_0 = 0x43,
112*795d594fSAndroid Build Coastguard Worker kFstore_1 = 0x44,
113*795d594fSAndroid Build Coastguard Worker kFstore_2 = 0x45,
114*795d594fSAndroid Build Coastguard Worker kFstore_3 = 0x46,
115*795d594fSAndroid Build Coastguard Worker kDstore_0 = 0x47,
116*795d594fSAndroid Build Coastguard Worker kDstore_1 = 0x48,
117*795d594fSAndroid Build Coastguard Worker kDstore_2 = 0x49,
118*795d594fSAndroid Build Coastguard Worker kDstore_3 = 0x4a,
119*795d594fSAndroid Build Coastguard Worker kAstore_0 = 0x4b,
120*795d594fSAndroid Build Coastguard Worker kAstore_1 = 0x4c,
121*795d594fSAndroid Build Coastguard Worker kAstore_2 = 0x4d,
122*795d594fSAndroid Build Coastguard Worker kAstore_3 = 0x4e,
123*795d594fSAndroid Build Coastguard Worker kIastore = 0x4f,
124*795d594fSAndroid Build Coastguard Worker kLastore = 0x50,
125*795d594fSAndroid Build Coastguard Worker kFastore = 0x51,
126*795d594fSAndroid Build Coastguard Worker kDastore = 0x52,
127*795d594fSAndroid Build Coastguard Worker kAastore = 0x53,
128*795d594fSAndroid Build Coastguard Worker kBastore = 0x54,
129*795d594fSAndroid Build Coastguard Worker kCastore = 0x55,
130*795d594fSAndroid Build Coastguard Worker kSastore = 0x56,
131*795d594fSAndroid Build Coastguard Worker kPop = 0x57,
132*795d594fSAndroid Build Coastguard Worker kPop2 = 0x58,
133*795d594fSAndroid Build Coastguard Worker kDup = 0x59,
134*795d594fSAndroid Build Coastguard Worker kDup_x1 = 0x5a,
135*795d594fSAndroid Build Coastguard Worker kDup_x2 = 0x5b,
136*795d594fSAndroid Build Coastguard Worker kDup2 = 0x5c,
137*795d594fSAndroid Build Coastguard Worker kDup2_x1 = 0x5d,
138*795d594fSAndroid Build Coastguard Worker kDup2_x2 = 0x5e,
139*795d594fSAndroid Build Coastguard Worker kSwap = 0x5f,
140*795d594fSAndroid Build Coastguard Worker kIadd = 0x60,
141*795d594fSAndroid Build Coastguard Worker kLadd = 0x61,
142*795d594fSAndroid Build Coastguard Worker kFadd = 0x62,
143*795d594fSAndroid Build Coastguard Worker kDadd = 0x63,
144*795d594fSAndroid Build Coastguard Worker kIsub = 0x64,
145*795d594fSAndroid Build Coastguard Worker kLsub = 0x65,
146*795d594fSAndroid Build Coastguard Worker kFsub = 0x66,
147*795d594fSAndroid Build Coastguard Worker kDsub = 0x67,
148*795d594fSAndroid Build Coastguard Worker kImul = 0x68,
149*795d594fSAndroid Build Coastguard Worker kLmul = 0x69,
150*795d594fSAndroid Build Coastguard Worker kFmul = 0x6a,
151*795d594fSAndroid Build Coastguard Worker kDmul = 0x6b,
152*795d594fSAndroid Build Coastguard Worker kIdiv = 0x6c,
153*795d594fSAndroid Build Coastguard Worker kLdiv = 0x6d,
154*795d594fSAndroid Build Coastguard Worker kFdiv = 0x6e,
155*795d594fSAndroid Build Coastguard Worker kDdiv = 0x6f,
156*795d594fSAndroid Build Coastguard Worker kIrem = 0x70,
157*795d594fSAndroid Build Coastguard Worker kLrem = 0x71,
158*795d594fSAndroid Build Coastguard Worker kFrem = 0x72,
159*795d594fSAndroid Build Coastguard Worker kDrem = 0x73,
160*795d594fSAndroid Build Coastguard Worker kIneg = 0x74,
161*795d594fSAndroid Build Coastguard Worker kLneg = 0x75,
162*795d594fSAndroid Build Coastguard Worker kFneg = 0x76,
163*795d594fSAndroid Build Coastguard Worker kDneg = 0x77,
164*795d594fSAndroid Build Coastguard Worker kIshl = 0x78,
165*795d594fSAndroid Build Coastguard Worker kLshl = 0x79,
166*795d594fSAndroid Build Coastguard Worker kIshr = 0x7a,
167*795d594fSAndroid Build Coastguard Worker kLshr = 0x7b,
168*795d594fSAndroid Build Coastguard Worker kIushr = 0x7c,
169*795d594fSAndroid Build Coastguard Worker kLushr = 0x7d,
170*795d594fSAndroid Build Coastguard Worker kIand = 0x7e,
171*795d594fSAndroid Build Coastguard Worker kLand = 0x7f,
172*795d594fSAndroid Build Coastguard Worker kIor = 0x80,
173*795d594fSAndroid Build Coastguard Worker kLor = 0x81,
174*795d594fSAndroid Build Coastguard Worker kIxor = 0x82,
175*795d594fSAndroid Build Coastguard Worker kLxor = 0x83,
176*795d594fSAndroid Build Coastguard Worker kIinc = 0x84,
177*795d594fSAndroid Build Coastguard Worker kI2l = 0x85,
178*795d594fSAndroid Build Coastguard Worker kI2f = 0x86,
179*795d594fSAndroid Build Coastguard Worker kI2d = 0x87,
180*795d594fSAndroid Build Coastguard Worker kL2i = 0x88,
181*795d594fSAndroid Build Coastguard Worker kL2f = 0x89,
182*795d594fSAndroid Build Coastguard Worker kL2d = 0x8a,
183*795d594fSAndroid Build Coastguard Worker kF2i = 0x8b,
184*795d594fSAndroid Build Coastguard Worker kF2l = 0x8c,
185*795d594fSAndroid Build Coastguard Worker kF2d = 0x8d,
186*795d594fSAndroid Build Coastguard Worker kD2i = 0x8e,
187*795d594fSAndroid Build Coastguard Worker kD2l = 0x8f,
188*795d594fSAndroid Build Coastguard Worker kD2f = 0x90,
189*795d594fSAndroid Build Coastguard Worker kI2b = 0x91,
190*795d594fSAndroid Build Coastguard Worker kI2c = 0x92,
191*795d594fSAndroid Build Coastguard Worker kI2s = 0x93,
192*795d594fSAndroid Build Coastguard Worker kLcmp = 0x94,
193*795d594fSAndroid Build Coastguard Worker kFcmpl = 0x95,
194*795d594fSAndroid Build Coastguard Worker kFcmpg = 0x96,
195*795d594fSAndroid Build Coastguard Worker kDcmpl = 0x97,
196*795d594fSAndroid Build Coastguard Worker kDcmpg = 0x98,
197*795d594fSAndroid Build Coastguard Worker kIfeq = 0x99,
198*795d594fSAndroid Build Coastguard Worker kIfne = 0x9a,
199*795d594fSAndroid Build Coastguard Worker kIflt = 0x9b,
200*795d594fSAndroid Build Coastguard Worker kIfge = 0x9c,
201*795d594fSAndroid Build Coastguard Worker kIfgt = 0x9d,
202*795d594fSAndroid Build Coastguard Worker kIfle = 0x9e,
203*795d594fSAndroid Build Coastguard Worker kIf_icmpeq = 0x9f,
204*795d594fSAndroid Build Coastguard Worker kIf_icmpne = 0xa0,
205*795d594fSAndroid Build Coastguard Worker kIf_icmplt = 0xa1,
206*795d594fSAndroid Build Coastguard Worker kIf_icmpge = 0xa2,
207*795d594fSAndroid Build Coastguard Worker kIf_icmpgt = 0xa3,
208*795d594fSAndroid Build Coastguard Worker kIf_icmple = 0xa4,
209*795d594fSAndroid Build Coastguard Worker kIf_acmpeq = 0xa5,
210*795d594fSAndroid Build Coastguard Worker kIf_acmpne = 0xa6,
211*795d594fSAndroid Build Coastguard Worker kGoto = 0xa7,
212*795d594fSAndroid Build Coastguard Worker kJsr = 0xa8,
213*795d594fSAndroid Build Coastguard Worker kRet = 0xa9,
214*795d594fSAndroid Build Coastguard Worker kTableswitch = 0xaa,
215*795d594fSAndroid Build Coastguard Worker kLookupswitch = 0xab,
216*795d594fSAndroid Build Coastguard Worker kIreturn = 0xac,
217*795d594fSAndroid Build Coastguard Worker kLreturn = 0xad,
218*795d594fSAndroid Build Coastguard Worker kFreturn = 0xae,
219*795d594fSAndroid Build Coastguard Worker kDreturn = 0xaf,
220*795d594fSAndroid Build Coastguard Worker kAreturn = 0xb0,
221*795d594fSAndroid Build Coastguard Worker kReturn = 0xb1,
222*795d594fSAndroid Build Coastguard Worker kGetstatic = 0xb2,
223*795d594fSAndroid Build Coastguard Worker kPutstatic = 0xb3,
224*795d594fSAndroid Build Coastguard Worker kGetfield = 0xb4,
225*795d594fSAndroid Build Coastguard Worker kPutfield = 0xb5,
226*795d594fSAndroid Build Coastguard Worker kInvokevirtual = 0xb6,
227*795d594fSAndroid Build Coastguard Worker kInvokespecial = 0xb7,
228*795d594fSAndroid Build Coastguard Worker kInvokestatic = 0xb8,
229*795d594fSAndroid Build Coastguard Worker kInvokeinterface = 0xb9,
230*795d594fSAndroid Build Coastguard Worker kInvokedynamic = 0xba,
231*795d594fSAndroid Build Coastguard Worker kNew = 0xbb,
232*795d594fSAndroid Build Coastguard Worker kNewarray = 0xbc,
233*795d594fSAndroid Build Coastguard Worker kAnewarray = 0xbd,
234*795d594fSAndroid Build Coastguard Worker kArraylength = 0xbe,
235*795d594fSAndroid Build Coastguard Worker kAthrow = 0xbf,
236*795d594fSAndroid Build Coastguard Worker kCheckcast = 0xc0,
237*795d594fSAndroid Build Coastguard Worker kInstanceof = 0xc1,
238*795d594fSAndroid Build Coastguard Worker kMonitorenter = 0xc2,
239*795d594fSAndroid Build Coastguard Worker kMonitorexit = 0xc3,
240*795d594fSAndroid Build Coastguard Worker kWide = 0xc4,
241*795d594fSAndroid Build Coastguard Worker kMultianewarray = 0xc5,
242*795d594fSAndroid Build Coastguard Worker kIfnull = 0xc6,
243*795d594fSAndroid Build Coastguard Worker kIfnonnull = 0xc7,
244*795d594fSAndroid Build Coastguard Worker kGoto_w = 0xc8,
245*795d594fSAndroid Build Coastguard Worker kJsr_w = 0xc9,
246*795d594fSAndroid Build Coastguard Worker kBreakpoint = 0xca,
247*795d594fSAndroid Build Coastguard Worker // Instructions 0xcb-0xfd are undefined.
248*795d594fSAndroid Build Coastguard Worker kImpdep1 = 0xfe,
249*795d594fSAndroid Build Coastguard Worker kImpdep2 = 0xff,
250*795d594fSAndroid Build Coastguard Worker };
251*795d594fSAndroid Build Coastguard Worker
ToString(Bytecode::Opcode op)252*795d594fSAndroid Build Coastguard Worker static const char* ToString(Bytecode::Opcode op) {
253*795d594fSAndroid Build Coastguard Worker switch (op) {
254*795d594fSAndroid Build Coastguard Worker case kNop: return "nop";
255*795d594fSAndroid Build Coastguard Worker case kAconst_null: return "aconst_null";
256*795d594fSAndroid Build Coastguard Worker case kIconst_m1: return "iconst_m1";
257*795d594fSAndroid Build Coastguard Worker case kIconst_0: return "iconst_0";
258*795d594fSAndroid Build Coastguard Worker case kIconst_1: return "iconst_1";
259*795d594fSAndroid Build Coastguard Worker case kIconst_2: return "iconst_2";
260*795d594fSAndroid Build Coastguard Worker case kIconst_3: return "iconst_3";
261*795d594fSAndroid Build Coastguard Worker case kIconst_4: return "iconst_4";
262*795d594fSAndroid Build Coastguard Worker case kIconst_5: return "iconst_5";
263*795d594fSAndroid Build Coastguard Worker case kLconst_0: return "lconst_0";
264*795d594fSAndroid Build Coastguard Worker case kLconst_1: return "lconst_1";
265*795d594fSAndroid Build Coastguard Worker case kFconst_0: return "fconst_0";
266*795d594fSAndroid Build Coastguard Worker case kFconst_1: return "fconst_1";
267*795d594fSAndroid Build Coastguard Worker case kFconst_2: return "fconst_2";
268*795d594fSAndroid Build Coastguard Worker case kDconst_0: return "dconst_0";
269*795d594fSAndroid Build Coastguard Worker case kDconst_1: return "dconst_1";
270*795d594fSAndroid Build Coastguard Worker case kBipush: return "bipush";
271*795d594fSAndroid Build Coastguard Worker case kSipush: return "sipush";
272*795d594fSAndroid Build Coastguard Worker case kLdc: return "ldc";
273*795d594fSAndroid Build Coastguard Worker case kLdc_w: return "ldc_w";
274*795d594fSAndroid Build Coastguard Worker case kLdc2_w: return "ldc2_w";
275*795d594fSAndroid Build Coastguard Worker case kIload: return "iload";
276*795d594fSAndroid Build Coastguard Worker case kLload: return "lload";
277*795d594fSAndroid Build Coastguard Worker case kFload: return "fload";
278*795d594fSAndroid Build Coastguard Worker case kDload: return "dload";
279*795d594fSAndroid Build Coastguard Worker case kAload: return "aload";
280*795d594fSAndroid Build Coastguard Worker case kIload_0: return "iload_0";
281*795d594fSAndroid Build Coastguard Worker case kIload_1: return "iload_1";
282*795d594fSAndroid Build Coastguard Worker case kIload_2: return "iload_2";
283*795d594fSAndroid Build Coastguard Worker case kIload_3: return "iload_3";
284*795d594fSAndroid Build Coastguard Worker case kLload_0: return "lload_0";
285*795d594fSAndroid Build Coastguard Worker case kLload_1: return "lload_1";
286*795d594fSAndroid Build Coastguard Worker case kLload_2: return "lload_2";
287*795d594fSAndroid Build Coastguard Worker case kLload_3: return "lload_3";
288*795d594fSAndroid Build Coastguard Worker case kFload_0: return "fload_0";
289*795d594fSAndroid Build Coastguard Worker case kFload_1: return "fload_1";
290*795d594fSAndroid Build Coastguard Worker case kFload_2: return "fload_2";
291*795d594fSAndroid Build Coastguard Worker case kFload_3: return "fload_3";
292*795d594fSAndroid Build Coastguard Worker case kDload_0: return "dload_0";
293*795d594fSAndroid Build Coastguard Worker case kDload_1: return "dload_1";
294*795d594fSAndroid Build Coastguard Worker case kDload_2: return "dload_2";
295*795d594fSAndroid Build Coastguard Worker case kDload_3: return "dload_3";
296*795d594fSAndroid Build Coastguard Worker case kAload_0: return "aload_0";
297*795d594fSAndroid Build Coastguard Worker case kAload_1: return "aload_1";
298*795d594fSAndroid Build Coastguard Worker case kAload_2: return "aload_2";
299*795d594fSAndroid Build Coastguard Worker case kAload_3: return "aload_3";
300*795d594fSAndroid Build Coastguard Worker case kIaload: return "iaload";
301*795d594fSAndroid Build Coastguard Worker case kLaload: return "laload";
302*795d594fSAndroid Build Coastguard Worker case kFaload: return "faload";
303*795d594fSAndroid Build Coastguard Worker case kDaload: return "daload";
304*795d594fSAndroid Build Coastguard Worker case kAaload: return "aaload";
305*795d594fSAndroid Build Coastguard Worker case kBaload: return "baload";
306*795d594fSAndroid Build Coastguard Worker case kCaload: return "caload";
307*795d594fSAndroid Build Coastguard Worker case kSaload: return "saload";
308*795d594fSAndroid Build Coastguard Worker case kIstore: return "istore";
309*795d594fSAndroid Build Coastguard Worker case kLstore: return "lstore";
310*795d594fSAndroid Build Coastguard Worker case kFstore: return "fstore";
311*795d594fSAndroid Build Coastguard Worker case kDstore: return "dstore";
312*795d594fSAndroid Build Coastguard Worker case kAstore: return "astore";
313*795d594fSAndroid Build Coastguard Worker case kIstore_0: return "istore_0";
314*795d594fSAndroid Build Coastguard Worker case kIstore_1: return "istore_1";
315*795d594fSAndroid Build Coastguard Worker case kIstore_2: return "istore_2";
316*795d594fSAndroid Build Coastguard Worker case kIstore_3: return "istore_3";
317*795d594fSAndroid Build Coastguard Worker case kLstore_0: return "lstore_0";
318*795d594fSAndroid Build Coastguard Worker case kLstore_1: return "lstore_1";
319*795d594fSAndroid Build Coastguard Worker case kLstore_2: return "lstore_2";
320*795d594fSAndroid Build Coastguard Worker case kLstore_3: return "lstore_3";
321*795d594fSAndroid Build Coastguard Worker case kFstore_0: return "fstore_0";
322*795d594fSAndroid Build Coastguard Worker case kFstore_1: return "fstore_1";
323*795d594fSAndroid Build Coastguard Worker case kFstore_2: return "fstore_2";
324*795d594fSAndroid Build Coastguard Worker case kFstore_3: return "fstore_3";
325*795d594fSAndroid Build Coastguard Worker case kDstore_0: return "dstore_0";
326*795d594fSAndroid Build Coastguard Worker case kDstore_1: return "dstore_1";
327*795d594fSAndroid Build Coastguard Worker case kDstore_2: return "dstore_2";
328*795d594fSAndroid Build Coastguard Worker case kDstore_3: return "dstore_3";
329*795d594fSAndroid Build Coastguard Worker case kAstore_0: return "astore_0";
330*795d594fSAndroid Build Coastguard Worker case kAstore_1: return "astore_1";
331*795d594fSAndroid Build Coastguard Worker case kAstore_2: return "astore_2";
332*795d594fSAndroid Build Coastguard Worker case kAstore_3: return "astore_3";
333*795d594fSAndroid Build Coastguard Worker case kIastore: return "iastore";
334*795d594fSAndroid Build Coastguard Worker case kLastore: return "lastore";
335*795d594fSAndroid Build Coastguard Worker case kFastore: return "fastore";
336*795d594fSAndroid Build Coastguard Worker case kDastore: return "dastore";
337*795d594fSAndroid Build Coastguard Worker case kAastore: return "aastore";
338*795d594fSAndroid Build Coastguard Worker case kBastore: return "bastore";
339*795d594fSAndroid Build Coastguard Worker case kCastore: return "castore";
340*795d594fSAndroid Build Coastguard Worker case kSastore: return "sastore";
341*795d594fSAndroid Build Coastguard Worker case kPop: return "pop";
342*795d594fSAndroid Build Coastguard Worker case kPop2: return "pop2";
343*795d594fSAndroid Build Coastguard Worker case kDup: return "dup";
344*795d594fSAndroid Build Coastguard Worker case kDup_x1: return "dup_x1";
345*795d594fSAndroid Build Coastguard Worker case kDup_x2: return "dup_x2";
346*795d594fSAndroid Build Coastguard Worker case kDup2: return "dup2";
347*795d594fSAndroid Build Coastguard Worker case kDup2_x1: return "dup2_x1";
348*795d594fSAndroid Build Coastguard Worker case kDup2_x2: return "dup2_x2";
349*795d594fSAndroid Build Coastguard Worker case kSwap: return "swap";
350*795d594fSAndroid Build Coastguard Worker case kIadd: return "iadd";
351*795d594fSAndroid Build Coastguard Worker case kLadd: return "ladd";
352*795d594fSAndroid Build Coastguard Worker case kFadd: return "fadd";
353*795d594fSAndroid Build Coastguard Worker case kDadd: return "dadd";
354*795d594fSAndroid Build Coastguard Worker case kIsub: return "isub";
355*795d594fSAndroid Build Coastguard Worker case kLsub: return "lsub";
356*795d594fSAndroid Build Coastguard Worker case kFsub: return "fsub";
357*795d594fSAndroid Build Coastguard Worker case kDsub: return "dsub";
358*795d594fSAndroid Build Coastguard Worker case kImul: return "imul";
359*795d594fSAndroid Build Coastguard Worker case kLmul: return "lmul";
360*795d594fSAndroid Build Coastguard Worker case kFmul: return "fmul";
361*795d594fSAndroid Build Coastguard Worker case kDmul: return "dmul";
362*795d594fSAndroid Build Coastguard Worker case kIdiv: return "idiv";
363*795d594fSAndroid Build Coastguard Worker case kLdiv: return "ldiv";
364*795d594fSAndroid Build Coastguard Worker case kFdiv: return "fdiv";
365*795d594fSAndroid Build Coastguard Worker case kDdiv: return "ddiv";
366*795d594fSAndroid Build Coastguard Worker case kIrem: return "irem";
367*795d594fSAndroid Build Coastguard Worker case kLrem: return "lrem";
368*795d594fSAndroid Build Coastguard Worker case kFrem: return "frem";
369*795d594fSAndroid Build Coastguard Worker case kDrem: return "drem";
370*795d594fSAndroid Build Coastguard Worker case kIneg: return "ineg";
371*795d594fSAndroid Build Coastguard Worker case kLneg: return "lneg";
372*795d594fSAndroid Build Coastguard Worker case kFneg: return "fneg";
373*795d594fSAndroid Build Coastguard Worker case kDneg: return "dneg";
374*795d594fSAndroid Build Coastguard Worker case kIshl: return "ishl";
375*795d594fSAndroid Build Coastguard Worker case kLshl: return "lshl";
376*795d594fSAndroid Build Coastguard Worker case kIshr: return "ishr";
377*795d594fSAndroid Build Coastguard Worker case kLshr: return "lshr";
378*795d594fSAndroid Build Coastguard Worker case kIushr: return "iushr";
379*795d594fSAndroid Build Coastguard Worker case kLushr: return "lushr";
380*795d594fSAndroid Build Coastguard Worker case kIand: return "iand";
381*795d594fSAndroid Build Coastguard Worker case kLand: return "land";
382*795d594fSAndroid Build Coastguard Worker case kIor: return "ior";
383*795d594fSAndroid Build Coastguard Worker case kLor: return "lor";
384*795d594fSAndroid Build Coastguard Worker case kIxor: return "ixor";
385*795d594fSAndroid Build Coastguard Worker case kLxor: return "lxor";
386*795d594fSAndroid Build Coastguard Worker case kIinc: return "iinc";
387*795d594fSAndroid Build Coastguard Worker case kI2l: return "i2l";
388*795d594fSAndroid Build Coastguard Worker case kI2f: return "i2f";
389*795d594fSAndroid Build Coastguard Worker case kI2d: return "i2d";
390*795d594fSAndroid Build Coastguard Worker case kL2i: return "l2i";
391*795d594fSAndroid Build Coastguard Worker case kL2f: return "l2f";
392*795d594fSAndroid Build Coastguard Worker case kL2d: return "l2d";
393*795d594fSAndroid Build Coastguard Worker case kF2i: return "f2i";
394*795d594fSAndroid Build Coastguard Worker case kF2l: return "f2l";
395*795d594fSAndroid Build Coastguard Worker case kF2d: return "f2d";
396*795d594fSAndroid Build Coastguard Worker case kD2i: return "d2i";
397*795d594fSAndroid Build Coastguard Worker case kD2l: return "d2l";
398*795d594fSAndroid Build Coastguard Worker case kD2f: return "d2f";
399*795d594fSAndroid Build Coastguard Worker case kI2b: return "i2b";
400*795d594fSAndroid Build Coastguard Worker case kI2c: return "i2c";
401*795d594fSAndroid Build Coastguard Worker case kI2s: return "i2s";
402*795d594fSAndroid Build Coastguard Worker case kLcmp: return "lcmp";
403*795d594fSAndroid Build Coastguard Worker case kFcmpl: return "fcmpl";
404*795d594fSAndroid Build Coastguard Worker case kFcmpg: return "fcmpg";
405*795d594fSAndroid Build Coastguard Worker case kDcmpl: return "dcmpl";
406*795d594fSAndroid Build Coastguard Worker case kDcmpg: return "dcmpg";
407*795d594fSAndroid Build Coastguard Worker case kIfeq: return "ifeq";
408*795d594fSAndroid Build Coastguard Worker case kIfne: return "ifne";
409*795d594fSAndroid Build Coastguard Worker case kIflt: return "iflt";
410*795d594fSAndroid Build Coastguard Worker case kIfge: return "ifge";
411*795d594fSAndroid Build Coastguard Worker case kIfgt: return "ifgt";
412*795d594fSAndroid Build Coastguard Worker case kIfle: return "ifle";
413*795d594fSAndroid Build Coastguard Worker case kIf_icmpeq: return "if_icmpeq";
414*795d594fSAndroid Build Coastguard Worker case kIf_icmpne: return "if_icmpne";
415*795d594fSAndroid Build Coastguard Worker case kIf_icmplt: return "if_icmplt";
416*795d594fSAndroid Build Coastguard Worker case kIf_icmpge: return "if_icmpge";
417*795d594fSAndroid Build Coastguard Worker case kIf_icmpgt: return "if_icmpgt";
418*795d594fSAndroid Build Coastguard Worker case kIf_icmple: return "if_icmple";
419*795d594fSAndroid Build Coastguard Worker case kIf_acmpeq: return "if_acmpeq";
420*795d594fSAndroid Build Coastguard Worker case kIf_acmpne: return "if_acmpne";
421*795d594fSAndroid Build Coastguard Worker case kGoto: return "goto";
422*795d594fSAndroid Build Coastguard Worker case kJsr: return "jsr";
423*795d594fSAndroid Build Coastguard Worker case kRet: return "ret";
424*795d594fSAndroid Build Coastguard Worker case kTableswitch: return "tableswitch";
425*795d594fSAndroid Build Coastguard Worker case kLookupswitch: return "lookupswitch";
426*795d594fSAndroid Build Coastguard Worker case kIreturn: return "ireturn";
427*795d594fSAndroid Build Coastguard Worker case kLreturn: return "lreturn";
428*795d594fSAndroid Build Coastguard Worker case kFreturn: return "freturn";
429*795d594fSAndroid Build Coastguard Worker case kDreturn: return "dreturn";
430*795d594fSAndroid Build Coastguard Worker case kAreturn: return "areturn";
431*795d594fSAndroid Build Coastguard Worker case kReturn: return "return";
432*795d594fSAndroid Build Coastguard Worker case kGetstatic: return "getstatic";
433*795d594fSAndroid Build Coastguard Worker case kPutstatic: return "putstatic";
434*795d594fSAndroid Build Coastguard Worker case kGetfield: return "getfield";
435*795d594fSAndroid Build Coastguard Worker case kPutfield: return "putfield";
436*795d594fSAndroid Build Coastguard Worker case kInvokevirtual: return "invokevirtual";
437*795d594fSAndroid Build Coastguard Worker case kInvokespecial: return "invokespecial";
438*795d594fSAndroid Build Coastguard Worker case kInvokestatic: return "invokestatic";
439*795d594fSAndroid Build Coastguard Worker case kInvokeinterface: return "invokeinterface";
440*795d594fSAndroid Build Coastguard Worker case kInvokedynamic: return "invokedynamic";
441*795d594fSAndroid Build Coastguard Worker case kNew: return "new";
442*795d594fSAndroid Build Coastguard Worker case kNewarray: return "newarray";
443*795d594fSAndroid Build Coastguard Worker case kAnewarray: return "anewarray";
444*795d594fSAndroid Build Coastguard Worker case kArraylength: return "arraylength";
445*795d594fSAndroid Build Coastguard Worker case kAthrow: return "athrow";
446*795d594fSAndroid Build Coastguard Worker case kCheckcast: return "checkcast";
447*795d594fSAndroid Build Coastguard Worker case kInstanceof: return "instanceof";
448*795d594fSAndroid Build Coastguard Worker case kMonitorenter: return "monitorenter";
449*795d594fSAndroid Build Coastguard Worker case kMonitorexit: return "monitorexit";
450*795d594fSAndroid Build Coastguard Worker case kWide: return "wide";
451*795d594fSAndroid Build Coastguard Worker case kMultianewarray: return "multianewarray";
452*795d594fSAndroid Build Coastguard Worker case kIfnull: return "ifnull";
453*795d594fSAndroid Build Coastguard Worker case kIfnonnull: return "ifnonnull";
454*795d594fSAndroid Build Coastguard Worker case kGoto_w: return "goto_w";
455*795d594fSAndroid Build Coastguard Worker case kJsr_w: return "jsr_w";
456*795d594fSAndroid Build Coastguard Worker case kBreakpoint: return "breakpoint";
457*795d594fSAndroid Build Coastguard Worker case kImpdep1: return "impdep1";
458*795d594fSAndroid Build Coastguard Worker case kImpdep2: return "impdep2";
459*795d594fSAndroid Build Coastguard Worker default:
460*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Unknown opcode " << op;
461*795d594fSAndroid Build Coastguard Worker __builtin_unreachable();
462*795d594fSAndroid Build Coastguard Worker }
463*795d594fSAndroid Build Coastguard Worker }
464*795d594fSAndroid Build Coastguard Worker };
465*795d594fSAndroid Build Coastguard Worker };
466*795d594fSAndroid Build Coastguard Worker
467*795d594fSAndroid Build Coastguard Worker class DexInstructionDecoder : public InstructionDecoder {
468*795d594fSAndroid Build Coastguard Worker public:
GetMaximumOpcode()469*795d594fSAndroid Build Coastguard Worker size_t GetMaximumOpcode() override {
470*795d594fSAndroid Build Coastguard Worker return 0xff;
471*795d594fSAndroid Build Coastguard Worker }
472*795d594fSAndroid Build Coastguard Worker
GetName(size_t opcode)473*795d594fSAndroid Build Coastguard Worker const char* GetName(size_t opcode) override {
474*795d594fSAndroid Build Coastguard Worker Bytecode::Opcode op = static_cast<Bytecode::Opcode>(opcode);
475*795d594fSAndroid Build Coastguard Worker return Bytecode::ToString(op);
476*795d594fSAndroid Build Coastguard Worker }
477*795d594fSAndroid Build Coastguard Worker
LocationToOffset(size_t j_location)478*795d594fSAndroid Build Coastguard Worker size_t LocationToOffset(size_t j_location) override {
479*795d594fSAndroid Build Coastguard Worker // dex pc is uint16_t*, but offset needs to be in bytes.
480*795d594fSAndroid Build Coastguard Worker return j_location * (sizeof(uint16_t) / sizeof(uint8_t));
481*795d594fSAndroid Build Coastguard Worker }
482*795d594fSAndroid Build Coastguard Worker
483*795d594fSAndroid Build Coastguard Worker private:
484*795d594fSAndroid Build Coastguard Worker class Bytecode {
485*795d594fSAndroid Build Coastguard Worker public:
486*795d594fSAndroid Build Coastguard Worker enum Opcode {
487*795d594fSAndroid Build Coastguard Worker #define MAKE_ENUM_DEFINITION(opcode, instruction_code, name, format, index, flags, extended_flags, verifier_flags) \
488*795d594fSAndroid Build Coastguard Worker instruction_code = opcode, /* NOLINT */
489*795d594fSAndroid Build Coastguard Worker DEX_INSTRUCTION_LIST(MAKE_ENUM_DEFINITION)
490*795d594fSAndroid Build Coastguard Worker #undef MAKE_ENUM_DEFINITION
491*795d594fSAndroid Build Coastguard Worker };
492*795d594fSAndroid Build Coastguard Worker
493*795d594fSAndroid Build Coastguard Worker static_assert(static_cast<uint32_t>(Bytecode::Opcode::NOP) == 0, "");
494*795d594fSAndroid Build Coastguard Worker static_assert(static_cast<uint32_t>(Bytecode::Opcode::MOVE) == 1, "");
495*795d594fSAndroid Build Coastguard Worker
ToString(Bytecode::Opcode op)496*795d594fSAndroid Build Coastguard Worker static const char* ToString(Bytecode::Opcode op) {
497*795d594fSAndroid Build Coastguard Worker switch (op) {
498*795d594fSAndroid Build Coastguard Worker #define MAKE_ENUM_DEFINITION(opcode, instruction_code, name, format, index, flags, extended_flags, verifier_flags) \
499*795d594fSAndroid Build Coastguard Worker case instruction_code: return (name);
500*795d594fSAndroid Build Coastguard Worker DEX_INSTRUCTION_LIST(MAKE_ENUM_DEFINITION)
501*795d594fSAndroid Build Coastguard Worker #undef MAKE_ENUM_DEFINITION
502*795d594fSAndroid Build Coastguard Worker default: LOG(FATAL) << "Unknown opcode " << op;
503*795d594fSAndroid Build Coastguard Worker }
504*795d594fSAndroid Build Coastguard Worker __builtin_unreachable();
505*795d594fSAndroid Build Coastguard Worker }
506*795d594fSAndroid Build Coastguard Worker };
507*795d594fSAndroid Build Coastguard Worker };
508*795d594fSAndroid Build Coastguard Worker
NewInstance(InstructionFileFormat file_format)509*795d594fSAndroid Build Coastguard Worker InstructionDecoder* InstructionDecoder::NewInstance(InstructionFileFormat file_format) {
510*795d594fSAndroid Build Coastguard Worker switch (file_format) {
511*795d594fSAndroid Build Coastguard Worker case InstructionFileFormat::kClass:
512*795d594fSAndroid Build Coastguard Worker return new ClassInstructionDecoder();
513*795d594fSAndroid Build Coastguard Worker case InstructionFileFormat::kDex:
514*795d594fSAndroid Build Coastguard Worker return new DexInstructionDecoder();
515*795d594fSAndroid Build Coastguard Worker default:
516*795d594fSAndroid Build Coastguard Worker return nullptr;
517*795d594fSAndroid Build Coastguard Worker }
518*795d594fSAndroid Build Coastguard Worker }
519*795d594fSAndroid Build Coastguard Worker } // namespace titrace
520