1800b99b8Sopenharmony_ci/*
2800b99b8Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3800b99b8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4800b99b8Sopenharmony_ci * you may not use this file except in compliance with the License.
5800b99b8Sopenharmony_ci * You may obtain a copy of the License at
6800b99b8Sopenharmony_ci *
7800b99b8Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8800b99b8Sopenharmony_ci *
9800b99b8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10800b99b8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11800b99b8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12800b99b8Sopenharmony_ci * See the License for the specific language governing permissions and
13800b99b8Sopenharmony_ci * limitations under the License.
14800b99b8Sopenharmony_ci */
15800b99b8Sopenharmony_ci
16800b99b8Sopenharmony_ci#include "dwarf_op.h"
17800b99b8Sopenharmony_ci#include <cstring>
18800b99b8Sopenharmony_ci#include "dfx_log.h"
19800b99b8Sopenharmony_ci
20800b99b8Sopenharmony_cinamespace OHOS {
21800b99b8Sopenharmony_cinamespace HiviewDFX {
22800b99b8Sopenharmony_cinamespace {
23800b99b8Sopenharmony_ci#undef LOG_DOMAIN
24800b99b8Sopenharmony_ci#undef LOG_TAG
25800b99b8Sopenharmony_ci#define LOG_DOMAIN 0xD002D11
26800b99b8Sopenharmony_ci#define LOG_TAG "DfxDwarfOp"
27800b99b8Sopenharmony_ci}
28800b99b8Sopenharmony_ci
29800b99b8Sopenharmony_citemplate <typename AddressType>
30800b99b8Sopenharmony_ciAddressType DwarfOp<AddressType>::Eval(DfxRegs& regs, AddressType initStackValue, AddressType startPtr)
31800b99b8Sopenharmony_ci{
32800b99b8Sopenharmony_ci    DFXLOGU("Eval: initStackValue=%{public}" PRIuPTR ", startPtr=%{public}" PRIuPTR "", initStackValue, startPtr);
33800b99b8Sopenharmony_ci    StackReset(initStackValue);
34800b99b8Sopenharmony_ci
35800b99b8Sopenharmony_ci    uintptr_t addr = startPtr;
36800b99b8Sopenharmony_ci    uintptr_t length = memory_->ReadUleb128(addr);
37800b99b8Sopenharmony_ci    uintptr_t end = addr + length;
38800b99b8Sopenharmony_ci    while (addr < end) {
39800b99b8Sopenharmony_ci        if (!Decode(regs, addr)) {
40800b99b8Sopenharmony_ci            break;
41800b99b8Sopenharmony_ci        }
42800b99b8Sopenharmony_ci    }
43800b99b8Sopenharmony_ci
44800b99b8Sopenharmony_ci    if (stack_.empty()) {
45800b99b8Sopenharmony_ci        DFXLOGE("Eval: stack empty");
46800b99b8Sopenharmony_ci        return 0;
47800b99b8Sopenharmony_ci    }
48800b99b8Sopenharmony_ci    return static_cast<AddressType>(StackPop());
49800b99b8Sopenharmony_ci}
50800b99b8Sopenharmony_ci
51800b99b8Sopenharmony_citemplate <typename AddressType>
52800b99b8Sopenharmony_cibool DwarfOp<AddressType>::Decode(DfxRegs& regs, uintptr_t& addr)
53800b99b8Sopenharmony_ci{
54800b99b8Sopenharmony_ci    uint8_t opcode;
55800b99b8Sopenharmony_ci    memory_->ReadU8(addr, &opcode, true);
56800b99b8Sopenharmony_ci    switch (opcode) {
57800b99b8Sopenharmony_ci        case DW_OP_addr: {
58800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_addr");
59800b99b8Sopenharmony_ci            uintptr_t val;
60800b99b8Sopenharmony_ci            memory_->ReadUptr(addr, &val, true);
61800b99b8Sopenharmony_ci            OpPush(val);
62800b99b8Sopenharmony_ci        }
63800b99b8Sopenharmony_ci            break;
64800b99b8Sopenharmony_ci        case DW_OP_deref:
65800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_deref");
66800b99b8Sopenharmony_ci            OpDeref();
67800b99b8Sopenharmony_ci            break;
68800b99b8Sopenharmony_ci        case DW_OP_const1u: {
69800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_const1u");
70800b99b8Sopenharmony_ci            uint8_t val;
71800b99b8Sopenharmony_ci            memory_->ReadU8(addr, &val, true);
72800b99b8Sopenharmony_ci            OpPush(val);
73800b99b8Sopenharmony_ci        }
74800b99b8Sopenharmony_ci            break;
75800b99b8Sopenharmony_ci        case DW_OP_const1s: {
76800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_const1s");
77800b99b8Sopenharmony_ci            int8_t val;
78800b99b8Sopenharmony_ci            memory_->ReadS8(addr, &val, true);
79800b99b8Sopenharmony_ci            OpPush(val);
80800b99b8Sopenharmony_ci        }
81800b99b8Sopenharmony_ci            break;
82800b99b8Sopenharmony_ci        case DW_OP_const2u: {
83800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_const2u");
84800b99b8Sopenharmony_ci            uint16_t val;
85800b99b8Sopenharmony_ci            memory_->ReadU16(addr, &val, true);
86800b99b8Sopenharmony_ci            OpPush(val);
87800b99b8Sopenharmony_ci        }
88800b99b8Sopenharmony_ci            break;
89800b99b8Sopenharmony_ci        case DW_OP_const2s: {
90800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_const2s");
91800b99b8Sopenharmony_ci            int16_t val;
92800b99b8Sopenharmony_ci            memory_->ReadS16(addr, &val, true);
93800b99b8Sopenharmony_ci            OpPush(val);
94800b99b8Sopenharmony_ci        }
95800b99b8Sopenharmony_ci            break;
96800b99b8Sopenharmony_ci        case DW_OP_const4u: {
97800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_const4u");
98800b99b8Sopenharmony_ci            uint32_t val;
99800b99b8Sopenharmony_ci            memory_->ReadU32(addr, &val, true);
100800b99b8Sopenharmony_ci            OpPush(val);
101800b99b8Sopenharmony_ci        }
102800b99b8Sopenharmony_ci            break;
103800b99b8Sopenharmony_ci        case DW_OP_const4s: {
104800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_const4s");
105800b99b8Sopenharmony_ci            int32_t val;
106800b99b8Sopenharmony_ci            memory_->ReadS32(addr, &val, true);
107800b99b8Sopenharmony_ci            OpPush(val);
108800b99b8Sopenharmony_ci        }
109800b99b8Sopenharmony_ci            break;
110800b99b8Sopenharmony_ci        case DW_OP_const8u: {
111800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_const8u");
112800b99b8Sopenharmony_ci            uint64_t val;
113800b99b8Sopenharmony_ci            memory_->ReadU64(addr, &val, true);
114800b99b8Sopenharmony_ci            OpPush(val);
115800b99b8Sopenharmony_ci        }
116800b99b8Sopenharmony_ci            break;
117800b99b8Sopenharmony_ci        case DW_OP_const8s: {
118800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_const8s");
119800b99b8Sopenharmony_ci            int64_t val;
120800b99b8Sopenharmony_ci            memory_->ReadS64(addr, &val, true);
121800b99b8Sopenharmony_ci            OpPush(val);
122800b99b8Sopenharmony_ci        }
123800b99b8Sopenharmony_ci            break;
124800b99b8Sopenharmony_ci        case DW_OP_constu:
125800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_constu");
126800b99b8Sopenharmony_ci            OpPush(memory_->ReadUleb128(addr));
127800b99b8Sopenharmony_ci            break;
128800b99b8Sopenharmony_ci        case DW_OP_consts:
129800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_consts");
130800b99b8Sopenharmony_ci            OpPush(memory_->ReadSleb128(addr));
131800b99b8Sopenharmony_ci            break;
132800b99b8Sopenharmony_ci        case DW_OP_dup:
133800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_dup");
134800b99b8Sopenharmony_ci            OpDup();
135800b99b8Sopenharmony_ci            break;
136800b99b8Sopenharmony_ci        case DW_OP_drop:
137800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_drop");
138800b99b8Sopenharmony_ci            OpDrop();
139800b99b8Sopenharmony_ci            break;
140800b99b8Sopenharmony_ci        case DW_OP_over:
141800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_over");
142800b99b8Sopenharmony_ci            OpOver();
143800b99b8Sopenharmony_ci            break;
144800b99b8Sopenharmony_ci        case DW_OP_pick:
145800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_pick");
146800b99b8Sopenharmony_ci            OpPick(addr);
147800b99b8Sopenharmony_ci            break;
148800b99b8Sopenharmony_ci        case DW_OP_swap:
149800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_swap");
150800b99b8Sopenharmony_ci            OpSwap();
151800b99b8Sopenharmony_ci            break;
152800b99b8Sopenharmony_ci        case DW_OP_rot:
153800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_rot");
154800b99b8Sopenharmony_ci            OpRot();
155800b99b8Sopenharmony_ci            break;
156800b99b8Sopenharmony_ci        case DW_OP_abs:
157800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_abs");
158800b99b8Sopenharmony_ci            OpAbs();
159800b99b8Sopenharmony_ci            break;
160800b99b8Sopenharmony_ci        case DW_OP_and:
161800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_and");
162800b99b8Sopenharmony_ci            OpAnd();
163800b99b8Sopenharmony_ci            break;
164800b99b8Sopenharmony_ci        case DW_OP_div:
165800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_div");
166800b99b8Sopenharmony_ci            OpDiv();
167800b99b8Sopenharmony_ci            break;
168800b99b8Sopenharmony_ci        case DW_OP_minus:
169800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_minus");
170800b99b8Sopenharmony_ci            OpMinus();
171800b99b8Sopenharmony_ci            break;
172800b99b8Sopenharmony_ci        case DW_OP_mod:
173800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_mod");
174800b99b8Sopenharmony_ci            OpMod();
175800b99b8Sopenharmony_ci            break;
176800b99b8Sopenharmony_ci        case DW_OP_mul:
177800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_mul");
178800b99b8Sopenharmony_ci            OpMul();
179800b99b8Sopenharmony_ci            break;
180800b99b8Sopenharmony_ci        case DW_OP_neg:
181800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_neg");
182800b99b8Sopenharmony_ci            OpNeg();
183800b99b8Sopenharmony_ci            break;
184800b99b8Sopenharmony_ci        case DW_OP_not:
185800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_not");
186800b99b8Sopenharmony_ci            OpNot();
187800b99b8Sopenharmony_ci            break;
188800b99b8Sopenharmony_ci        case DW_OP_or:
189800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_or");
190800b99b8Sopenharmony_ci            OpOr();
191800b99b8Sopenharmony_ci            break;
192800b99b8Sopenharmony_ci        case DW_OP_plus:
193800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_plus");
194800b99b8Sopenharmony_ci            OpPlus();
195800b99b8Sopenharmony_ci            break;
196800b99b8Sopenharmony_ci        case DW_OP_plus_uconst:
197800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_plus_uconst");
198800b99b8Sopenharmony_ci            OpPlusULEBConst(addr);
199800b99b8Sopenharmony_ci            break;
200800b99b8Sopenharmony_ci        case DW_OP_shl:
201800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_shl");
202800b99b8Sopenharmony_ci            OpShl();
203800b99b8Sopenharmony_ci            break;
204800b99b8Sopenharmony_ci        case DW_OP_shr:
205800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_shr");
206800b99b8Sopenharmony_ci            OpShr();
207800b99b8Sopenharmony_ci            break;
208800b99b8Sopenharmony_ci        case DW_OP_shra:
209800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_shra");
210800b99b8Sopenharmony_ci            OpShra();
211800b99b8Sopenharmony_ci            break;
212800b99b8Sopenharmony_ci        case DW_OP_xor:
213800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_xor");
214800b99b8Sopenharmony_ci            OpXor();
215800b99b8Sopenharmony_ci            break;
216800b99b8Sopenharmony_ci        case DW_OP_skip:
217800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_skip");
218800b99b8Sopenharmony_ci            OpSkip(addr);
219800b99b8Sopenharmony_ci            break;
220800b99b8Sopenharmony_ci        case DW_OP_bra:
221800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_bra");
222800b99b8Sopenharmony_ci            OpBra(addr);
223800b99b8Sopenharmony_ci            break;
224800b99b8Sopenharmony_ci        case DW_OP_eq:
225800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_eq");
226800b99b8Sopenharmony_ci            OpEQ();
227800b99b8Sopenharmony_ci            break;
228800b99b8Sopenharmony_ci        case DW_OP_ge:
229800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_ge");
230800b99b8Sopenharmony_ci            OpGE();
231800b99b8Sopenharmony_ci            break;
232800b99b8Sopenharmony_ci        case DW_OP_gt:
233800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_gt");
234800b99b8Sopenharmony_ci            OpGT();
235800b99b8Sopenharmony_ci            break;
236800b99b8Sopenharmony_ci        case DW_OP_le:
237800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_le");
238800b99b8Sopenharmony_ci            OpLE();
239800b99b8Sopenharmony_ci            break;
240800b99b8Sopenharmony_ci        case DW_OP_lt:
241800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_lt");
242800b99b8Sopenharmony_ci            OpLT();
243800b99b8Sopenharmony_ci            break;
244800b99b8Sopenharmony_ci        case DW_OP_ne:
245800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_ne");
246800b99b8Sopenharmony_ci            OpNE();
247800b99b8Sopenharmony_ci            break;
248800b99b8Sopenharmony_ci        case DW_OP_lit0:
249800b99b8Sopenharmony_ci        case DW_OP_lit1:
250800b99b8Sopenharmony_ci        case DW_OP_lit2:
251800b99b8Sopenharmony_ci        case DW_OP_lit3:
252800b99b8Sopenharmony_ci        case DW_OP_lit4:
253800b99b8Sopenharmony_ci        case DW_OP_lit5:
254800b99b8Sopenharmony_ci        case DW_OP_lit6:
255800b99b8Sopenharmony_ci        case DW_OP_lit7:
256800b99b8Sopenharmony_ci        case DW_OP_lit8:
257800b99b8Sopenharmony_ci        case DW_OP_lit9:
258800b99b8Sopenharmony_ci        case DW_OP_lit10:
259800b99b8Sopenharmony_ci        case DW_OP_lit11:
260800b99b8Sopenharmony_ci        case DW_OP_lit12:
261800b99b8Sopenharmony_ci        case DW_OP_lit13:
262800b99b8Sopenharmony_ci        case DW_OP_lit14:
263800b99b8Sopenharmony_ci        case DW_OP_lit15:
264800b99b8Sopenharmony_ci        case DW_OP_lit16:
265800b99b8Sopenharmony_ci        case DW_OP_lit17:
266800b99b8Sopenharmony_ci        case DW_OP_lit18:
267800b99b8Sopenharmony_ci        case DW_OP_lit19:
268800b99b8Sopenharmony_ci        case DW_OP_lit20:
269800b99b8Sopenharmony_ci        case DW_OP_lit21:
270800b99b8Sopenharmony_ci        case DW_OP_lit22:
271800b99b8Sopenharmony_ci        case DW_OP_lit23:
272800b99b8Sopenharmony_ci        case DW_OP_lit24:
273800b99b8Sopenharmony_ci        case DW_OP_lit25:
274800b99b8Sopenharmony_ci        case DW_OP_lit26:
275800b99b8Sopenharmony_ci        case DW_OP_lit27:
276800b99b8Sopenharmony_ci        case DW_OP_lit28:
277800b99b8Sopenharmony_ci        case DW_OP_lit29:
278800b99b8Sopenharmony_ci        case DW_OP_lit30:
279800b99b8Sopenharmony_ci        case DW_OP_lit31:
280800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_litXX");
281800b99b8Sopenharmony_ci            OpLit(opcode);
282800b99b8Sopenharmony_ci            break;
283800b99b8Sopenharmony_ci        case DW_OP_reg0:
284800b99b8Sopenharmony_ci        case DW_OP_reg1:
285800b99b8Sopenharmony_ci        case DW_OP_reg2:
286800b99b8Sopenharmony_ci        case DW_OP_reg3:
287800b99b8Sopenharmony_ci        case DW_OP_reg4:
288800b99b8Sopenharmony_ci        case DW_OP_reg5:
289800b99b8Sopenharmony_ci        case DW_OP_reg6:
290800b99b8Sopenharmony_ci        case DW_OP_reg7:
291800b99b8Sopenharmony_ci        case DW_OP_reg8:
292800b99b8Sopenharmony_ci        case DW_OP_reg9:
293800b99b8Sopenharmony_ci        case DW_OP_reg10:
294800b99b8Sopenharmony_ci        case DW_OP_reg11:
295800b99b8Sopenharmony_ci        case DW_OP_reg12:
296800b99b8Sopenharmony_ci        case DW_OP_reg13:
297800b99b8Sopenharmony_ci        case DW_OP_reg14:
298800b99b8Sopenharmony_ci        case DW_OP_reg15:
299800b99b8Sopenharmony_ci        case DW_OP_reg16:
300800b99b8Sopenharmony_ci        case DW_OP_reg17:
301800b99b8Sopenharmony_ci        case DW_OP_reg18:
302800b99b8Sopenharmony_ci        case DW_OP_reg19:
303800b99b8Sopenharmony_ci        case DW_OP_reg20:
304800b99b8Sopenharmony_ci        case DW_OP_reg21:
305800b99b8Sopenharmony_ci        case DW_OP_reg22:
306800b99b8Sopenharmony_ci        case DW_OP_reg23:
307800b99b8Sopenharmony_ci        case DW_OP_reg24:
308800b99b8Sopenharmony_ci        case DW_OP_reg25:
309800b99b8Sopenharmony_ci        case DW_OP_reg26:
310800b99b8Sopenharmony_ci        case DW_OP_reg27:
311800b99b8Sopenharmony_ci        case DW_OP_reg28:
312800b99b8Sopenharmony_ci        case DW_OP_reg29:
313800b99b8Sopenharmony_ci        case DW_OP_reg30:
314800b99b8Sopenharmony_ci        case DW_OP_reg31:
315800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_regXX");
316800b99b8Sopenharmony_ci            OpReg(opcode, regs);
317800b99b8Sopenharmony_ci            break;
318800b99b8Sopenharmony_ci        case DW_OP_regx:
319800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_regx");
320800b99b8Sopenharmony_ci            OpRegx(addr, regs);
321800b99b8Sopenharmony_ci            break;
322800b99b8Sopenharmony_ci        case DW_OP_breg0:
323800b99b8Sopenharmony_ci        case DW_OP_breg1:
324800b99b8Sopenharmony_ci        case DW_OP_breg2:
325800b99b8Sopenharmony_ci        case DW_OP_breg3:
326800b99b8Sopenharmony_ci        case DW_OP_breg4:
327800b99b8Sopenharmony_ci        case DW_OP_breg5:
328800b99b8Sopenharmony_ci        case DW_OP_breg6:
329800b99b8Sopenharmony_ci        case DW_OP_breg7:
330800b99b8Sopenharmony_ci        case DW_OP_breg8:
331800b99b8Sopenharmony_ci        case DW_OP_breg9:
332800b99b8Sopenharmony_ci        case DW_OP_breg10:
333800b99b8Sopenharmony_ci        case DW_OP_breg11:
334800b99b8Sopenharmony_ci        case DW_OP_breg12:
335800b99b8Sopenharmony_ci        case DW_OP_breg13:
336800b99b8Sopenharmony_ci        case DW_OP_breg14:
337800b99b8Sopenharmony_ci        case DW_OP_breg15:
338800b99b8Sopenharmony_ci        case DW_OP_breg16:
339800b99b8Sopenharmony_ci        case DW_OP_breg17:
340800b99b8Sopenharmony_ci        case DW_OP_breg18:
341800b99b8Sopenharmony_ci        case DW_OP_breg19:
342800b99b8Sopenharmony_ci        case DW_OP_breg20:
343800b99b8Sopenharmony_ci        case DW_OP_breg21:
344800b99b8Sopenharmony_ci        case DW_OP_breg22:
345800b99b8Sopenharmony_ci        case DW_OP_breg23:
346800b99b8Sopenharmony_ci        case DW_OP_breg24:
347800b99b8Sopenharmony_ci        case DW_OP_breg25:
348800b99b8Sopenharmony_ci        case DW_OP_breg26:
349800b99b8Sopenharmony_ci        case DW_OP_breg27:
350800b99b8Sopenharmony_ci        case DW_OP_breg28:
351800b99b8Sopenharmony_ci        case DW_OP_breg29:
352800b99b8Sopenharmony_ci        case DW_OP_breg30:
353800b99b8Sopenharmony_ci        case DW_OP_breg31:
354800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_bregXX");
355800b99b8Sopenharmony_ci            OpBReg(opcode, addr, regs);
356800b99b8Sopenharmony_ci            break;
357800b99b8Sopenharmony_ci        case DW_OP_bregx:
358800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_bregx");
359800b99b8Sopenharmony_ci            OpBRegx(addr, regs);
360800b99b8Sopenharmony_ci            break;
361800b99b8Sopenharmony_ci        case DW_OP_deref_size:
362800b99b8Sopenharmony_ci            DFXLOGU("DW_OP_deref_size");
363800b99b8Sopenharmony_ci            OpDerefSize(addr);
364800b99b8Sopenharmony_ci            break;
365800b99b8Sopenharmony_ci        case DW_OP_fbreg:
366800b99b8Sopenharmony_ci        case DW_OP_piece:
367800b99b8Sopenharmony_ci        case DW_OP_xderef:
368800b99b8Sopenharmony_ci        case DW_OP_xderef_size:
369800b99b8Sopenharmony_ci        case DW_OP_nop:
370800b99b8Sopenharmony_ci        case DW_OP_push_object_address:
371800b99b8Sopenharmony_ci        case DW_OP_call2:
372800b99b8Sopenharmony_ci        case DW_OP_call4:
373800b99b8Sopenharmony_ci        case DW_OP_call_ref:
374800b99b8Sopenharmony_ci            DFXLOGE("DWARF OpNop opcode: %{public}x", opcode);
375800b99b8Sopenharmony_ci            OpNop(opcode);
376800b99b8Sopenharmony_ci            break;
377800b99b8Sopenharmony_ci        default:
378800b99b8Sopenharmony_ci            DFXLOGE("DWARF Unexpected opcode: %{public}x", opcode);
379800b99b8Sopenharmony_ci            return false;
380800b99b8Sopenharmony_ci    }
381800b99b8Sopenharmony_ci    return true;
382800b99b8Sopenharmony_ci}
383800b99b8Sopenharmony_ci
384800b99b8Sopenharmony_ci// offline unwind should support both dwarf32 and dwarf64 ?
385800b99b8Sopenharmony_citemplate class DwarfOp<uintptr_t>;
386800b99b8Sopenharmony_ci
387800b99b8Sopenharmony_ci}   // namespace HiviewDFX
388800b99b8Sopenharmony_ci}   // namespace OHOS
389