• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (C) 2016 The Android Open Source Project
3   *
4   * Licensed under the Apache License, Version 2.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *      http://www.apache.org/licenses/LICENSE-2.0
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  #ifndef _LIBUNWINDSTACK_DWARF_OP_H
18  #define _LIBUNWINDSTACK_DWARF_OP_H
19  
20  #include <stdint.h>
21  
22  #include <deque>
23  #include <string>
24  #include <type_traits>
25  #include <vector>
26  
27  #include <unwindstack/DwarfError.h>
28  
29  #include "DwarfEncoding.h"
30  #include "RegsInfo.h"
31  
32  namespace unwindstack {
33  
34  // Forward declarations.
35  class DwarfMemory;
36  class Memory;
37  template <typename AddressType>
38  class RegsImpl;
39  
40  template <typename AddressType>
41  class DwarfOp {
42    // Signed version of AddressType
43    typedef typename std::make_signed<AddressType>::type SignedType;
44  
45    struct OpCallback {
46      const char* name;
47      bool (DwarfOp::*handle_func)();
48      uint8_t num_required_stack_values;
49      uint8_t num_operands;
50      uint8_t operands[2];
51    };
52  
53   public:
DwarfOp(DwarfMemory * memory,Memory * regular_memory)54    DwarfOp(DwarfMemory* memory, Memory* regular_memory)
55        : memory_(memory), regular_memory_(regular_memory) {}
56    virtual ~DwarfOp() = default;
57  
58    bool Decode();
59  
60    bool Eval(uint64_t start, uint64_t end);
61  
62    void GetLogInfo(uint64_t start, uint64_t end, std::vector<std::string>* lines);
63  
StackAt(size_t index)64    AddressType StackAt(size_t index) { return stack_[index]; }
StackSize()65    size_t StackSize() { return stack_.size(); }
66  
set_regs_info(RegsInfo<AddressType> * regs_info)67    void set_regs_info(RegsInfo<AddressType>* regs_info) { regs_info_ = regs_info; }
68  
last_error()69    const DwarfErrorData& last_error() { return last_error_; }
LastErrorCode()70    DwarfErrorCode LastErrorCode() { return last_error_.code; }
LastErrorAddress()71    uint64_t LastErrorAddress() { return last_error_.address; }
72  
dex_pc_set()73    bool dex_pc_set() { return dex_pc_set_; }
74  
is_register()75    bool is_register() { return is_register_; }
76  
cur_op()77    uint8_t cur_op() { return cur_op_; }
78  
regular_memory()79    Memory* regular_memory() { return regular_memory_; }
80  
81   protected:
OperandAt(size_t index)82    AddressType OperandAt(size_t index) { return operands_[index]; }
OperandsSize()83    size_t OperandsSize() { return operands_.size(); }
84  
StackPop()85    AddressType StackPop() {
86      AddressType value = stack_.front();
87      stack_.pop_front();
88      return value;
89    }
90  
91   private:
92    DwarfMemory* memory_;
93    Memory* regular_memory_;
94  
95    RegsInfo<AddressType>* regs_info_;
96    bool dex_pc_set_ = false;
97    bool is_register_ = false;
98    DwarfErrorData last_error_{DWARF_ERROR_NONE, 0};
99    uint8_t cur_op_;
100    std::vector<AddressType> operands_;
101    std::deque<AddressType> stack_;
102  
bool_to_dwarf_bool(bool value)103    inline AddressType bool_to_dwarf_bool(bool value) { return value ? 1 : 0; }
104  
105    // Op processing functions.
106    bool op_deref();
107    bool op_deref_size();
108    bool op_push();
109    bool op_dup();
110    bool op_drop();
111    bool op_over();
112    bool op_pick();
113    bool op_swap();
114    bool op_rot();
115    bool op_abs();
116    bool op_and();
117    bool op_div();
118    bool op_minus();
119    bool op_mod();
120    bool op_mul();
121    bool op_neg();
122    bool op_not();
123    bool op_or();
124    bool op_plus();
125    bool op_plus_uconst();
126    bool op_shl();
127    bool op_shr();
128    bool op_shra();
129    bool op_xor();
130    bool op_bra();
131    bool op_eq();
132    bool op_ge();
133    bool op_gt();
134    bool op_le();
135    bool op_lt();
136    bool op_ne();
137    bool op_skip();
138    bool op_lit();
139    bool op_reg();
140    bool op_regx();
141    bool op_breg();
142    bool op_bregx();
143    bool op_nop();
144    bool op_not_implemented();
145  
146    constexpr static OpCallback kCallbackTable[256] = {
147        {nullptr, nullptr, 0, 0, {}},  // 0x00 illegal op
148        {nullptr, nullptr, 0, 0, {}},  // 0x01 illegal op
149        {nullptr, nullptr, 0, 0, {}},  // 0x02 illegal op
150        {
151            // 0x03 DW_OP_addr
152            "DW_OP_addr",
153            &DwarfOp::op_push,
154            0,
155            1,
156            {DW_EH_PE_absptr},
157        },
158        {nullptr, nullptr, 0, 0, {}},  // 0x04 illegal op
159        {nullptr, nullptr, 0, 0, {}},  // 0x05 illegal op
160        {
161            // 0x06 DW_OP_deref
162            "DW_OP_deref",
163            &DwarfOp::op_deref,
164            1,
165            0,
166            {},
167        },
168        {nullptr, nullptr, 0, 0, {}},  // 0x07 illegal op
169        {
170            // 0x08 DW_OP_const1u
171            "DW_OP_const1u",
172            &DwarfOp::op_push,
173            0,
174            1,
175            {DW_EH_PE_udata1},
176        },
177        {
178            // 0x09 DW_OP_const1s
179            "DW_OP_const1s",
180            &DwarfOp::op_push,
181            0,
182            1,
183            {DW_EH_PE_sdata1},
184        },
185        {
186            // 0x0a DW_OP_const2u
187            "DW_OP_const2u",
188            &DwarfOp::op_push,
189            0,
190            1,
191            {DW_EH_PE_udata2},
192        },
193        {
194            // 0x0b DW_OP_const2s
195            "DW_OP_const2s",
196            &DwarfOp::op_push,
197            0,
198            1,
199            {DW_EH_PE_sdata2},
200        },
201        {
202            // 0x0c DW_OP_const4u
203            "DW_OP_const4u",
204            &DwarfOp::op_push,
205            0,
206            1,
207            {DW_EH_PE_udata4},
208        },
209        {
210            // 0x0d DW_OP_const4s
211            "DW_OP_const4s",
212            &DwarfOp::op_push,
213            0,
214            1,
215            {DW_EH_PE_sdata4},
216        },
217        {
218            // 0x0e DW_OP_const8u
219            "DW_OP_const8u",
220            &DwarfOp::op_push,
221            0,
222            1,
223            {DW_EH_PE_udata8},
224        },
225        {
226            // 0x0f DW_OP_const8s
227            "DW_OP_const8s",
228            &DwarfOp::op_push,
229            0,
230            1,
231            {DW_EH_PE_sdata8},
232        },
233        {
234            // 0x10 DW_OP_constu
235            "DW_OP_constu",
236            &DwarfOp::op_push,
237            0,
238            1,
239            {DW_EH_PE_uleb128},
240        },
241        {
242            // 0x11 DW_OP_consts
243            "DW_OP_consts",
244            &DwarfOp::op_push,
245            0,
246            1,
247            {DW_EH_PE_sleb128},
248        },
249        {
250            // 0x12 DW_OP_dup
251            "DW_OP_dup",
252            &DwarfOp::op_dup,
253            1,
254            0,
255            {},
256        },
257        {
258            // 0x13 DW_OP_drop
259            "DW_OP_drop",
260            &DwarfOp::op_drop,
261            1,
262            0,
263            {},
264        },
265        {
266            // 0x14 DW_OP_over
267            "DW_OP_over",
268            &DwarfOp::op_over,
269            2,
270            0,
271            {},
272        },
273        {
274            // 0x15 DW_OP_pick
275            "DW_OP_pick",
276            &DwarfOp::op_pick,
277            0,
278            1,
279            {DW_EH_PE_udata1},
280        },
281        {
282            // 0x16 DW_OP_swap
283            "DW_OP_swap",
284            &DwarfOp::op_swap,
285            2,
286            0,
287            {},
288        },
289        {
290            // 0x17 DW_OP_rot
291            "DW_OP_rot",
292            &DwarfOp::op_rot,
293            3,
294            0,
295            {},
296        },
297        {
298            // 0x18 DW_OP_xderef
299            "DW_OP_xderef",
300            &DwarfOp::op_not_implemented,
301            2,
302            0,
303            {},
304        },
305        {
306            // 0x19 DW_OP_abs
307            "DW_OP_abs",
308            &DwarfOp::op_abs,
309            1,
310            0,
311            {},
312        },
313        {
314            // 0x1a DW_OP_and
315            "DW_OP_and",
316            &DwarfOp::op_and,
317            2,
318            0,
319            {},
320        },
321        {
322            // 0x1b DW_OP_div
323            "DW_OP_div",
324            &DwarfOp::op_div,
325            2,
326            0,
327            {},
328        },
329        {
330            // 0x1c DW_OP_minus
331            "DW_OP_minus",
332            &DwarfOp::op_minus,
333            2,
334            0,
335            {},
336        },
337        {
338            // 0x1d DW_OP_mod
339            "DW_OP_mod",
340            &DwarfOp::op_mod,
341            2,
342            0,
343            {},
344        },
345        {
346            // 0x1e DW_OP_mul
347            "DW_OP_mul",
348            &DwarfOp::op_mul,
349            2,
350            0,
351            {},
352        },
353        {
354            // 0x1f DW_OP_neg
355            "DW_OP_neg",
356            &DwarfOp::op_neg,
357            1,
358            0,
359            {},
360        },
361        {
362            // 0x20 DW_OP_not
363            "DW_OP_not",
364            &DwarfOp::op_not,
365            1,
366            0,
367            {},
368        },
369        {
370            // 0x21 DW_OP_or
371            "DW_OP_or",
372            &DwarfOp::op_or,
373            2,
374            0,
375            {},
376        },
377        {
378            // 0x22 DW_OP_plus
379            "DW_OP_plus",
380            &DwarfOp::op_plus,
381            2,
382            0,
383            {},
384        },
385        {
386            // 0x23 DW_OP_plus_uconst
387            "DW_OP_plus_uconst",
388            &DwarfOp::op_plus_uconst,
389            1,
390            1,
391            {DW_EH_PE_uleb128},
392        },
393        {
394            // 0x24 DW_OP_shl
395            "DW_OP_shl",
396            &DwarfOp::op_shl,
397            2,
398            0,
399            {},
400        },
401        {
402            // 0x25 DW_OP_shr
403            "DW_OP_shr",
404            &DwarfOp::op_shr,
405            2,
406            0,
407            {},
408        },
409        {
410            // 0x26 DW_OP_shra
411            "DW_OP_shra",
412            &DwarfOp::op_shra,
413            2,
414            0,
415            {},
416        },
417        {
418            // 0x27 DW_OP_xor
419            "DW_OP_xor",
420            &DwarfOp::op_xor,
421            2,
422            0,
423            {},
424        },
425        {
426            // 0x28 DW_OP_bra
427            "DW_OP_bra",
428            &DwarfOp::op_bra,
429            1,
430            1,
431            {DW_EH_PE_sdata2},
432        },
433        {
434            // 0x29 DW_OP_eq
435            "DW_OP_eq",
436            &DwarfOp::op_eq,
437            2,
438            0,
439            {},
440        },
441        {
442            // 0x2a DW_OP_ge
443            "DW_OP_ge",
444            &DwarfOp::op_ge,
445            2,
446            0,
447            {},
448        },
449        {
450            // 0x2b DW_OP_gt
451            "DW_OP_gt",
452            &DwarfOp::op_gt,
453            2,
454            0,
455            {},
456        },
457        {
458            // 0x2c DW_OP_le
459            "DW_OP_le",
460            &DwarfOp::op_le,
461            2,
462            0,
463            {},
464        },
465        {
466            // 0x2d DW_OP_lt
467            "DW_OP_lt",
468            &DwarfOp::op_lt,
469            2,
470            0,
471            {},
472        },
473        {
474            // 0x2e DW_OP_ne
475            "DW_OP_ne",
476            &DwarfOp::op_ne,
477            2,
478            0,
479            {},
480        },
481        {
482            // 0x2f DW_OP_skip
483            "DW_OP_skip",
484            &DwarfOp::op_skip,
485            0,
486            1,
487            {DW_EH_PE_sdata2},
488        },
489        {
490            // 0x30 DW_OP_lit0
491            "DW_OP_lit0",
492            &DwarfOp::op_lit,
493            0,
494            0,
495            {},
496        },
497        {
498            // 0x31 DW_OP_lit1
499            "DW_OP_lit1",
500            &DwarfOp::op_lit,
501            0,
502            0,
503            {},
504        },
505        {
506            // 0x32 DW_OP_lit2
507            "DW_OP_lit2",
508            &DwarfOp::op_lit,
509            0,
510            0,
511            {},
512        },
513        {
514            // 0x33 DW_OP_lit3
515            "DW_OP_lit3",
516            &DwarfOp::op_lit,
517            0,
518            0,
519            {},
520        },
521        {
522            // 0x34 DW_OP_lit4
523            "DW_OP_lit4",
524            &DwarfOp::op_lit,
525            0,
526            0,
527            {},
528        },
529        {
530            // 0x35 DW_OP_lit5
531            "DW_OP_lit5",
532            &DwarfOp::op_lit,
533            0,
534            0,
535            {},
536        },
537        {
538            // 0x36 DW_OP_lit6
539            "DW_OP_lit6",
540            &DwarfOp::op_lit,
541            0,
542            0,
543            {},
544        },
545        {
546            // 0x37 DW_OP_lit7
547            "DW_OP_lit7",
548            &DwarfOp::op_lit,
549            0,
550            0,
551            {},
552        },
553        {
554            // 0x38 DW_OP_lit8
555            "DW_OP_lit8",
556            &DwarfOp::op_lit,
557            0,
558            0,
559            {},
560        },
561        {
562            // 0x39 DW_OP_lit9
563            "DW_OP_lit9",
564            &DwarfOp::op_lit,
565            0,
566            0,
567            {},
568        },
569        {
570            // 0x3a DW_OP_lit10
571            "DW_OP_lit10",
572            &DwarfOp::op_lit,
573            0,
574            0,
575            {},
576        },
577        {
578            // 0x3b DW_OP_lit11
579            "DW_OP_lit11",
580            &DwarfOp::op_lit,
581            0,
582            0,
583            {},
584        },
585        {
586            // 0x3c DW_OP_lit12
587            "DW_OP_lit12",
588            &DwarfOp::op_lit,
589            0,
590            0,
591            {},
592        },
593        {
594            // 0x3d DW_OP_lit13
595            "DW_OP_lit13",
596            &DwarfOp::op_lit,
597            0,
598            0,
599            {},
600        },
601        {
602            // 0x3e DW_OP_lit14
603            "DW_OP_lit14",
604            &DwarfOp::op_lit,
605            0,
606            0,
607            {},
608        },
609        {
610            // 0x3f DW_OP_lit15
611            "DW_OP_lit15",
612            &DwarfOp::op_lit,
613            0,
614            0,
615            {},
616        },
617        {
618            // 0x40 DW_OP_lit16
619            "DW_OP_lit16",
620            &DwarfOp::op_lit,
621            0,
622            0,
623            {},
624        },
625        {
626            // 0x41 DW_OP_lit17
627            "DW_OP_lit17",
628            &DwarfOp::op_lit,
629            0,
630            0,
631            {},
632        },
633        {
634            // 0x42 DW_OP_lit18
635            "DW_OP_lit18",
636            &DwarfOp::op_lit,
637            0,
638            0,
639            {},
640        },
641        {
642            // 0x43 DW_OP_lit19
643            "DW_OP_lit19",
644            &DwarfOp::op_lit,
645            0,
646            0,
647            {},
648        },
649        {
650            // 0x44 DW_OP_lit20
651            "DW_OP_lit20",
652            &DwarfOp::op_lit,
653            0,
654            0,
655            {},
656        },
657        {
658            // 0x45 DW_OP_lit21
659            "DW_OP_lit21",
660            &DwarfOp::op_lit,
661            0,
662            0,
663            {},
664        },
665        {
666            // 0x46 DW_OP_lit22
667            "DW_OP_lit22",
668            &DwarfOp::op_lit,
669            0,
670            0,
671            {},
672        },
673        {
674            // 0x47 DW_OP_lit23
675            "DW_OP_lit23",
676            &DwarfOp::op_lit,
677            0,
678            0,
679            {},
680        },
681        {
682            // 0x48 DW_OP_lit24
683            "DW_OP_lit24",
684            &DwarfOp::op_lit,
685            0,
686            0,
687            {},
688        },
689        {
690            // 0x49 DW_OP_lit25
691            "DW_OP_lit25",
692            &DwarfOp::op_lit,
693            0,
694            0,
695            {},
696        },
697        {
698            // 0x4a DW_OP_lit26
699            "DW_OP_lit26",
700            &DwarfOp::op_lit,
701            0,
702            0,
703            {},
704        },
705        {
706            // 0x4b DW_OP_lit27
707            "DW_OP_lit27",
708            &DwarfOp::op_lit,
709            0,
710            0,
711            {},
712        },
713        {
714            // 0x4c DW_OP_lit28
715            "DW_OP_lit28",
716            &DwarfOp::op_lit,
717            0,
718            0,
719            {},
720        },
721        {
722            // 0x4d DW_OP_lit29
723            "DW_OP_lit29",
724            &DwarfOp::op_lit,
725            0,
726            0,
727            {},
728        },
729        {
730            // 0x4e DW_OP_lit30
731            "DW_OP_lit30",
732            &DwarfOp::op_lit,
733            0,
734            0,
735            {},
736        },
737        {
738            // 0x4f DW_OP_lit31
739            "DW_OP_lit31",
740            &DwarfOp::op_lit,
741            0,
742            0,
743            {},
744        },
745        {
746            // 0x50 DW_OP_reg0
747            "DW_OP_reg0",
748            &DwarfOp::op_reg,
749            0,
750            0,
751            {},
752        },
753        {
754            // 0x51 DW_OP_reg1
755            "DW_OP_reg1",
756            &DwarfOp::op_reg,
757            0,
758            0,
759            {},
760        },
761        {
762            // 0x52 DW_OP_reg2
763            "DW_OP_reg2",
764            &DwarfOp::op_reg,
765            0,
766            0,
767            {},
768        },
769        {
770            // 0x53 DW_OP_reg3
771            "DW_OP_reg3",
772            &DwarfOp::op_reg,
773            0,
774            0,
775            {},
776        },
777        {
778            // 0x54 DW_OP_reg4
779            "DW_OP_reg4",
780            &DwarfOp::op_reg,
781            0,
782            0,
783            {},
784        },
785        {
786            // 0x55 DW_OP_reg5
787            "DW_OP_reg5",
788            &DwarfOp::op_reg,
789            0,
790            0,
791            {},
792        },
793        {
794            // 0x56 DW_OP_reg6
795            "DW_OP_reg6",
796            &DwarfOp::op_reg,
797            0,
798            0,
799            {},
800        },
801        {
802            // 0x57 DW_OP_reg7
803            "DW_OP_reg7",
804            &DwarfOp::op_reg,
805            0,
806            0,
807            {},
808        },
809        {
810            // 0x58 DW_OP_reg8
811            "DW_OP_reg8",
812            &DwarfOp::op_reg,
813            0,
814            0,
815            {},
816        },
817        {
818            // 0x59 DW_OP_reg9
819            "DW_OP_reg9",
820            &DwarfOp::op_reg,
821            0,
822            0,
823            {},
824        },
825        {
826            // 0x5a DW_OP_reg10
827            "DW_OP_reg10",
828            &DwarfOp::op_reg,
829            0,
830            0,
831            {},
832        },
833        {
834            // 0x5b DW_OP_reg11
835            "DW_OP_reg11",
836            &DwarfOp::op_reg,
837            0,
838            0,
839            {},
840        },
841        {
842            // 0x5c DW_OP_reg12
843            "DW_OP_reg12",
844            &DwarfOp::op_reg,
845            0,
846            0,
847            {},
848        },
849        {
850            // 0x5d DW_OP_reg13
851            "DW_OP_reg13",
852            &DwarfOp::op_reg,
853            0,
854            0,
855            {},
856        },
857        {
858            // 0x5e DW_OP_reg14
859            "DW_OP_reg14",
860            &DwarfOp::op_reg,
861            0,
862            0,
863            {},
864        },
865        {
866            // 0x5f DW_OP_reg15
867            "DW_OP_reg15",
868            &DwarfOp::op_reg,
869            0,
870            0,
871            {},
872        },
873        {
874            // 0x60 DW_OP_reg16
875            "DW_OP_reg16",
876            &DwarfOp::op_reg,
877            0,
878            0,
879            {},
880        },
881        {
882            // 0x61 DW_OP_reg17
883            "DW_OP_reg17",
884            &DwarfOp::op_reg,
885            0,
886            0,
887            {},
888        },
889        {
890            // 0x62 DW_OP_reg18
891            "DW_OP_reg18",
892            &DwarfOp::op_reg,
893            0,
894            0,
895            {},
896        },
897        {
898            // 0x63 DW_OP_reg19
899            "DW_OP_reg19",
900            &DwarfOp::op_reg,
901            0,
902            0,
903            {},
904        },
905        {
906            // 0x64 DW_OP_reg20
907            "DW_OP_reg20",
908            &DwarfOp::op_reg,
909            0,
910            0,
911            {},
912        },
913        {
914            // 0x65 DW_OP_reg21
915            "DW_OP_reg21",
916            &DwarfOp::op_reg,
917            0,
918            0,
919            {},
920        },
921        {
922            // 0x66 DW_OP_reg22
923            "DW_OP_reg22",
924            &DwarfOp::op_reg,
925            0,
926            0,
927            {},
928        },
929        {
930            // 0x67 DW_OP_reg23
931            "DW_OP_reg23",
932            &DwarfOp::op_reg,
933            0,
934            0,
935            {},
936        },
937        {
938            // 0x68 DW_OP_reg24
939            "DW_OP_reg24",
940            &DwarfOp::op_reg,
941            0,
942            0,
943            {},
944        },
945        {
946            // 0x69 DW_OP_reg25
947            "DW_OP_reg25",
948            &DwarfOp::op_reg,
949            0,
950            0,
951            {},
952        },
953        {
954            // 0x6a DW_OP_reg26
955            "DW_OP_reg26",
956            &DwarfOp::op_reg,
957            0,
958            0,
959            {},
960        },
961        {
962            // 0x6b DW_OP_reg27
963            "DW_OP_reg27",
964            &DwarfOp::op_reg,
965            0,
966            0,
967            {},
968        },
969        {
970            // 0x6c DW_OP_reg28
971            "DW_OP_reg28",
972            &DwarfOp::op_reg,
973            0,
974            0,
975            {},
976        },
977        {
978            // 0x6d DW_OP_reg29
979            "DW_OP_reg29",
980            &DwarfOp::op_reg,
981            0,
982            0,
983            {},
984        },
985        {
986            // 0x6e DW_OP_reg30
987            "DW_OP_reg30",
988            &DwarfOp::op_reg,
989            0,
990            0,
991            {},
992        },
993        {
994            // 0x6f DW_OP_reg31
995            "DW_OP_reg31",
996            &DwarfOp::op_reg,
997            0,
998            0,
999            {},
1000        },
1001        {
1002            // 0x70 DW_OP_breg0
1003            "DW_OP_breg0",
1004            &DwarfOp::op_breg,
1005            0,
1006            1,
1007            {DW_EH_PE_sleb128},
1008        },
1009        {
1010            // 0x71 DW_OP_breg1
1011            "DW_OP_breg1",
1012            &DwarfOp::op_breg,
1013            0,
1014            1,
1015            {DW_EH_PE_sleb128},
1016        },
1017        {
1018            // 0x72 DW_OP_breg2
1019            "DW_OP_breg2",
1020            &DwarfOp::op_breg,
1021            0,
1022            1,
1023            {DW_EH_PE_sleb128},
1024        },
1025        {
1026            // 0x73 DW_OP_breg3
1027            "DW_OP_breg3",
1028            &DwarfOp::op_breg,
1029            0,
1030            1,
1031            {DW_EH_PE_sleb128},
1032        },
1033        {
1034            // 0x74 DW_OP_breg4
1035            "DW_OP_breg4",
1036            &DwarfOp::op_breg,
1037            0,
1038            1,
1039            {DW_EH_PE_sleb128},
1040        },
1041        {
1042            // 0x75 DW_OP_breg5
1043            "DW_OP_breg5",
1044            &DwarfOp::op_breg,
1045            0,
1046            1,
1047            {DW_EH_PE_sleb128},
1048        },
1049        {
1050            // 0x76 DW_OP_breg6
1051            "DW_OP_breg6",
1052            &DwarfOp::op_breg,
1053            0,
1054            1,
1055            {DW_EH_PE_sleb128},
1056        },
1057        {
1058            // 0x77 DW_OP_breg7
1059            "DW_OP_breg7",
1060            &DwarfOp::op_breg,
1061            0,
1062            1,
1063            {DW_EH_PE_sleb128},
1064        },
1065        {
1066            // 0x78 DW_OP_breg8
1067            "DW_OP_breg8",
1068            &DwarfOp::op_breg,
1069            0,
1070            1,
1071            {DW_EH_PE_sleb128},
1072        },
1073        {
1074            // 0x79 DW_OP_breg9
1075            "DW_OP_breg9",
1076            &DwarfOp::op_breg,
1077            0,
1078            1,
1079            {DW_EH_PE_sleb128},
1080        },
1081        {
1082            // 0x7a DW_OP_breg10
1083            "DW_OP_breg10",
1084            &DwarfOp::op_breg,
1085            0,
1086            1,
1087            {DW_EH_PE_sleb128},
1088        },
1089        {
1090            // 0x7b DW_OP_breg11
1091            "DW_OP_breg11",
1092            &DwarfOp::op_breg,
1093            0,
1094            1,
1095            {DW_EH_PE_sleb128},
1096        },
1097        {
1098            // 0x7c DW_OP_breg12
1099            "DW_OP_breg12",
1100            &DwarfOp::op_breg,
1101            0,
1102            1,
1103            {DW_EH_PE_sleb128},
1104        },
1105        {
1106            // 0x7d DW_OP_breg13
1107            "DW_OP_breg13",
1108            &DwarfOp::op_breg,
1109            0,
1110            1,
1111            {DW_EH_PE_sleb128},
1112        },
1113        {
1114            // 0x7e DW_OP_breg14
1115            "DW_OP_breg14",
1116            &DwarfOp::op_breg,
1117            0,
1118            1,
1119            {DW_EH_PE_sleb128},
1120        },
1121        {
1122            // 0x7f DW_OP_breg15
1123            "DW_OP_breg15",
1124            &DwarfOp::op_breg,
1125            0,
1126            1,
1127            {DW_EH_PE_sleb128},
1128        },
1129        {
1130            // 0x80 DW_OP_breg16
1131            "DW_OP_breg16",
1132            &DwarfOp::op_breg,
1133            0,
1134            1,
1135            {DW_EH_PE_sleb128},
1136        },
1137        {
1138            // 0x81 DW_OP_breg17
1139            "DW_OP_breg17",
1140            &DwarfOp::op_breg,
1141            0,
1142            1,
1143            {DW_EH_PE_sleb128},
1144        },
1145        {
1146            // 0x82 DW_OP_breg18
1147            "DW_OP_breg18",
1148            &DwarfOp::op_breg,
1149            0,
1150            1,
1151            {DW_EH_PE_sleb128},
1152        },
1153        {
1154            // 0x83 DW_OP_breg19
1155            "DW_OP_breg19",
1156            &DwarfOp::op_breg,
1157            0,
1158            1,
1159            {DW_EH_PE_sleb128},
1160        },
1161        {
1162            // 0x84 DW_OP_breg20
1163            "DW_OP_breg20",
1164            &DwarfOp::op_breg,
1165            0,
1166            1,
1167            {DW_EH_PE_sleb128},
1168        },
1169        {
1170            // 0x85 DW_OP_breg21
1171            "DW_OP_breg21",
1172            &DwarfOp::op_breg,
1173            0,
1174            1,
1175            {DW_EH_PE_sleb128},
1176        },
1177        {
1178            // 0x86 DW_OP_breg22
1179            "DW_OP_breg22",
1180            &DwarfOp::op_breg,
1181            0,
1182            1,
1183            {DW_EH_PE_sleb128},
1184        },
1185        {
1186            // 0x87 DW_OP_breg23
1187            "DW_OP_breg23",
1188            &DwarfOp::op_breg,
1189            0,
1190            1,
1191            {DW_EH_PE_sleb128},
1192        },
1193        {
1194            // 0x88 DW_OP_breg24
1195            "DW_OP_breg24",
1196            &DwarfOp::op_breg,
1197            0,
1198            1,
1199            {DW_EH_PE_sleb128},
1200        },
1201        {
1202            // 0x89 DW_OP_breg25
1203            "DW_OP_breg25",
1204            &DwarfOp::op_breg,
1205            0,
1206            1,
1207            {DW_EH_PE_sleb128},
1208        },
1209        {
1210            // 0x8a DW_OP_breg26
1211            "DW_OP_breg26",
1212            &DwarfOp::op_breg,
1213            0,
1214            1,
1215            {DW_EH_PE_sleb128},
1216        },
1217        {
1218            // 0x8b DW_OP_breg27
1219            "DW_OP_breg27",
1220            &DwarfOp::op_breg,
1221            0,
1222            1,
1223            {DW_EH_PE_sleb128},
1224        },
1225        {
1226            // 0x8c DW_OP_breg28
1227            "DW_OP_breg28",
1228            &DwarfOp::op_breg,
1229            0,
1230            1,
1231            {DW_EH_PE_sleb128},
1232        },
1233        {
1234            // 0x8d DW_OP_breg29
1235            "DW_OP_breg29",
1236            &DwarfOp::op_breg,
1237            0,
1238            1,
1239            {DW_EH_PE_sleb128},
1240        },
1241        {
1242            // 0x8e DW_OP_breg30
1243            "DW_OP_breg30",
1244            &DwarfOp::op_breg,
1245            0,
1246            1,
1247            {DW_EH_PE_sleb128},
1248        },
1249        {
1250            // 0x8f DW_OP_breg31
1251            "DW_OP_breg31",
1252            &DwarfOp::op_breg,
1253            0,
1254            1,
1255            {DW_EH_PE_sleb128},
1256        },
1257        {
1258            // 0x90 DW_OP_regx
1259            "DW_OP_regx",
1260            &DwarfOp::op_regx,
1261            0,
1262            1,
1263            {DW_EH_PE_uleb128},
1264        },
1265        {
1266            // 0x91 DW_OP_fbreg
1267            "DW_OP_fbreg",
1268            &DwarfOp::op_not_implemented,
1269            0,
1270            1,
1271            {DW_EH_PE_sleb128},
1272        },
1273        {
1274            // 0x92 DW_OP_bregx
1275            "DW_OP_bregx",
1276            &DwarfOp::op_bregx,
1277            0,
1278            2,
1279            {DW_EH_PE_uleb128, DW_EH_PE_sleb128},
1280        },
1281        {
1282            // 0x93 DW_OP_piece
1283            "DW_OP_piece",
1284            &DwarfOp::op_not_implemented,
1285            0,
1286            1,
1287            {DW_EH_PE_uleb128},
1288        },
1289        {
1290            // 0x94 DW_OP_deref_size
1291            "DW_OP_deref_size",
1292            &DwarfOp::op_deref_size,
1293            1,
1294            1,
1295            {DW_EH_PE_udata1},
1296        },
1297        {
1298            // 0x95 DW_OP_xderef_size
1299            "DW_OP_xderef_size",
1300            &DwarfOp::op_not_implemented,
1301            0,
1302            1,
1303            {DW_EH_PE_udata1},
1304        },
1305        {
1306            // 0x96 DW_OP_nop
1307            "DW_OP_nop",
1308            &DwarfOp::op_nop,
1309            0,
1310            0,
1311            {},
1312        },
1313        {
1314            // 0x97 DW_OP_push_object_address
1315            "DW_OP_push_object_address",
1316            &DwarfOp::op_not_implemented,
1317            0,
1318            0,
1319            {},
1320        },
1321        {
1322            // 0x98 DW_OP_call2
1323            "DW_OP_call2",
1324            &DwarfOp::op_not_implemented,
1325            0,
1326            1,
1327            {DW_EH_PE_udata2},
1328        },
1329        {
1330            // 0x99 DW_OP_call4
1331            "DW_OP_call4",
1332            &DwarfOp::op_not_implemented,
1333            0,
1334            1,
1335            {DW_EH_PE_udata4},
1336        },
1337        {
1338            // 0x9a DW_OP_call_ref
1339            "DW_OP_call_ref",
1340            &DwarfOp::op_not_implemented,
1341            0,
1342            0,  // Has a different sized operand (4 bytes or 8 bytes).
1343            {},
1344        },
1345        {
1346            // 0x9b DW_OP_form_tls_address
1347            "DW_OP_form_tls_address",
1348            &DwarfOp::op_not_implemented,
1349            0,
1350            0,
1351            {},
1352        },
1353        {
1354            // 0x9c DW_OP_call_frame_cfa
1355            "DW_OP_call_frame_cfa",
1356            &DwarfOp::op_not_implemented,
1357            0,
1358            0,
1359            {},
1360        },
1361        {
1362            // 0x9d DW_OP_bit_piece
1363            "DW_OP_bit_piece",
1364            &DwarfOp::op_not_implemented,
1365            0,
1366            2,
1367            {DW_EH_PE_uleb128, DW_EH_PE_uleb128},
1368        },
1369        {
1370            // 0x9e DW_OP_implicit_value
1371            "DW_OP_implicit_value",
1372            &DwarfOp::op_not_implemented,
1373            0,
1374            1,
1375            {DW_EH_PE_uleb128},
1376        },
1377        {
1378            // 0x9f DW_OP_stack_value
1379            "DW_OP_stack_value",
1380            &DwarfOp::op_not_implemented,
1381            1,
1382            0,
1383            {},
1384        },
1385        {nullptr, nullptr, 0, 0, {}},  // 0xa0 illegal op
1386        {nullptr, nullptr, 0, 0, {}},  // 0xa1 illegal op
1387        {nullptr, nullptr, 0, 0, {}},  // 0xa2 illegal op
1388        {nullptr, nullptr, 0, 0, {}},  // 0xa3 illegal op
1389        {nullptr, nullptr, 0, 0, {}},  // 0xa4 illegal op
1390        {nullptr, nullptr, 0, 0, {}},  // 0xa5 illegal op
1391        {nullptr, nullptr, 0, 0, {}},  // 0xa6 illegal op
1392        {nullptr, nullptr, 0, 0, {}},  // 0xa7 illegal op
1393        {nullptr, nullptr, 0, 0, {}},  // 0xa8 illegal op
1394        {nullptr, nullptr, 0, 0, {}},  // 0xa9 illegal op
1395        {nullptr, nullptr, 0, 0, {}},  // 0xaa illegal op
1396        {nullptr, nullptr, 0, 0, {}},  // 0xab illegal op
1397        {nullptr, nullptr, 0, 0, {}},  // 0xac illegal op
1398        {nullptr, nullptr, 0, 0, {}},  // 0xad illegal op
1399        {nullptr, nullptr, 0, 0, {}},  // 0xae illegal op
1400        {nullptr, nullptr, 0, 0, {}},  // 0xaf illegal op
1401        {nullptr, nullptr, 0, 0, {}},  // 0xb0 illegal op
1402        {nullptr, nullptr, 0, 0, {}},  // 0xb1 illegal op
1403        {nullptr, nullptr, 0, 0, {}},  // 0xb2 illegal op
1404        {nullptr, nullptr, 0, 0, {}},  // 0xb3 illegal op
1405        {nullptr, nullptr, 0, 0, {}},  // 0xb4 illegal op
1406        {nullptr, nullptr, 0, 0, {}},  // 0xb5 illegal op
1407        {nullptr, nullptr, 0, 0, {}},  // 0xb6 illegal op
1408        {nullptr, nullptr, 0, 0, {}},  // 0xb7 illegal op
1409        {nullptr, nullptr, 0, 0, {}},  // 0xb8 illegal op
1410        {nullptr, nullptr, 0, 0, {}},  // 0xb9 illegal op
1411        {nullptr, nullptr, 0, 0, {}},  // 0xba illegal op
1412        {nullptr, nullptr, 0, 0, {}},  // 0xbb illegal op
1413        {nullptr, nullptr, 0, 0, {}},  // 0xbc illegal op
1414        {nullptr, nullptr, 0, 0, {}},  // 0xbd illegal op
1415        {nullptr, nullptr, 0, 0, {}},  // 0xbe illegal op
1416        {nullptr, nullptr, 0, 0, {}},  // 0xbf illegal op
1417        {nullptr, nullptr, 0, 0, {}},  // 0xc0 illegal op
1418        {nullptr, nullptr, 0, 0, {}},  // 0xc1 illegal op
1419        {nullptr, nullptr, 0, 0, {}},  // 0xc2 illegal op
1420        {nullptr, nullptr, 0, 0, {}},  // 0xc3 illegal op
1421        {nullptr, nullptr, 0, 0, {}},  // 0xc4 illegal op
1422        {nullptr, nullptr, 0, 0, {}},  // 0xc5 illegal op
1423        {nullptr, nullptr, 0, 0, {}},  // 0xc6 illegal op
1424        {nullptr, nullptr, 0, 0, {}},  // 0xc7 illegal op
1425        {nullptr, nullptr, 0, 0, {}},  // 0xc8 illegal op
1426        {nullptr, nullptr, 0, 0, {}},  // 0xc9 illegal op
1427        {nullptr, nullptr, 0, 0, {}},  // 0xca illegal op
1428        {nullptr, nullptr, 0, 0, {}},  // 0xcb illegal op
1429        {nullptr, nullptr, 0, 0, {}},  // 0xcc illegal op
1430        {nullptr, nullptr, 0, 0, {}},  // 0xcd illegal op
1431        {nullptr, nullptr, 0, 0, {}},  // 0xce illegal op
1432        {nullptr, nullptr, 0, 0, {}},  // 0xcf illegal op
1433        {nullptr, nullptr, 0, 0, {}},  // 0xd0 illegal op
1434        {nullptr, nullptr, 0, 0, {}},  // 0xd1 illegal op
1435        {nullptr, nullptr, 0, 0, {}},  // 0xd2 illegal op
1436        {nullptr, nullptr, 0, 0, {}},  // 0xd3 illegal op
1437        {nullptr, nullptr, 0, 0, {}},  // 0xd4 illegal op
1438        {nullptr, nullptr, 0, 0, {}},  // 0xd5 illegal op
1439        {nullptr, nullptr, 0, 0, {}},  // 0xd6 illegal op
1440        {nullptr, nullptr, 0, 0, {}},  // 0xd7 illegal op
1441        {nullptr, nullptr, 0, 0, {}},  // 0xd8 illegal op
1442        {nullptr, nullptr, 0, 0, {}},  // 0xd9 illegal op
1443        {nullptr, nullptr, 0, 0, {}},  // 0xda illegal op
1444        {nullptr, nullptr, 0, 0, {}},  // 0xdb illegal op
1445        {nullptr, nullptr, 0, 0, {}},  // 0xdc illegal op
1446        {nullptr, nullptr, 0, 0, {}},  // 0xdd illegal op
1447        {nullptr, nullptr, 0, 0, {}},  // 0xde illegal op
1448        {nullptr, nullptr, 0, 0, {}},  // 0xdf illegal op
1449        {nullptr, nullptr, 0, 0, {}},  // 0xe0 DW_OP_lo_user
1450        {nullptr, nullptr, 0, 0, {}},  // 0xe1 illegal op
1451        {nullptr, nullptr, 0, 0, {}},  // 0xe2 illegal op
1452        {nullptr, nullptr, 0, 0, {}},  // 0xe3 illegal op
1453        {nullptr, nullptr, 0, 0, {}},  // 0xe4 illegal op
1454        {nullptr, nullptr, 0, 0, {}},  // 0xe5 illegal op
1455        {nullptr, nullptr, 0, 0, {}},  // 0xe6 illegal op
1456        {nullptr, nullptr, 0, 0, {}},  // 0xe7 illegal op
1457        {nullptr, nullptr, 0, 0, {}},  // 0xe8 illegal op
1458        {nullptr, nullptr, 0, 0, {}},  // 0xe9 illegal op
1459        {nullptr, nullptr, 0, 0, {}},  // 0xea illegal op
1460        {nullptr, nullptr, 0, 0, {}},  // 0xeb illegal op
1461        {nullptr, nullptr, 0, 0, {}},  // 0xec illegal op
1462        {nullptr, nullptr, 0, 0, {}},  // 0xed illegal op
1463        {nullptr, nullptr, 0, 0, {}},  // 0xee illegal op
1464        {nullptr, nullptr, 0, 0, {}},  // 0xef illegal op
1465        {nullptr, nullptr, 0, 0, {}},  // 0xf0 illegal op
1466        {nullptr, nullptr, 0, 0, {}},  // 0xf1 illegal op
1467        {nullptr, nullptr, 0, 0, {}},  // 0xf2 illegal op
1468        {nullptr, nullptr, 0, 0, {}},  // 0xf3 illegal op
1469        {nullptr, nullptr, 0, 0, {}},  // 0xf4 illegal op
1470        {nullptr, nullptr, 0, 0, {}},  // 0xf5 illegal op
1471        {nullptr, nullptr, 0, 0, {}},  // 0xf6 illegal op
1472        {nullptr, nullptr, 0, 0, {}},  // 0xf7 illegal op
1473        {nullptr, nullptr, 0, 0, {}},  // 0xf8 illegal op
1474        {nullptr, nullptr, 0, 0, {}},  // 0xf9 illegal op
1475        {nullptr, nullptr, 0, 0, {}},  // 0xfa illegal op
1476        {nullptr, nullptr, 0, 0, {}},  // 0xfb illegal op
1477        {nullptr, nullptr, 0, 0, {}},  // 0xfc illegal op
1478        {nullptr, nullptr, 0, 0, {}},  // 0xfd illegal op
1479        {nullptr, nullptr, 0, 0, {}},  // 0xfe illegal op
1480        {nullptr, nullptr, 0, 0, {}},  // 0xff DW_OP_hi_user
1481    };
1482  };
1483  
1484  }  // namespace unwindstack
1485  
1486  #endif  // _LIBUNWINDSTACK_DWARF_OP_H
1487