xref: /aosp_15_r20/art/tools/jvmti-agents/titrace/instruction_decoder.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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