[NFC][LLVM][CodeGen] Move LiveDebugVariables.h into llvm/include/llvm/CodeGen (#88374)
[llvm-project.git] / lldb / packages / Python / lldbsuite / test / lldbdwarf.py
blob1e421ce0fbcab4a405a58ba288a45fdd3c0f22d1
1 """ This module implement Dwarf expression opcode parser. """
3 import lldb
5 # DWARF Expression operators.
6 DW_OP_addr = 0x03
7 DW_OP_deref = 0x06
8 DW_OP_const1u = 0x08
9 DW_OP_const1s = 0x09
10 DW_OP_const2u = 0x0A
11 DW_OP_const2s = 0x0B
12 DW_OP_const4u = 0x0C
13 DW_OP_const4s = 0x0D
14 DW_OP_const8u = 0x0E
15 DW_OP_const8s = 0x0F
16 DW_OP_constu = 0x10
17 DW_OP_consts = 0x11
18 DW_OP_dup = 0x12
19 DW_OP_drop = 0x13
20 DW_OP_over = 0x14
21 DW_OP_pick = 0x15
22 DW_OP_swap = 0x16
23 DW_OP_rot = 0x17
24 DW_OP_xderef = 0x18
25 DW_OP_abs = 0x19
26 DW_OP_and = 0x1A
27 DW_OP_div = 0x1B
28 DW_OP_minus = 0x1C
29 DW_OP_mod = 0x1D
30 DW_OP_mul = 0x1E
31 DW_OP_neg = 0x1F
32 DW_OP_not = 0x20
33 DW_OP_or = 0x21
34 DW_OP_plus = 0x22
35 DW_OP_plus_uconst = 0x23
36 DW_OP_shl = 0x24
37 DW_OP_shr = 0x25
38 DW_OP_shra = 0x26
39 DW_OP_xor = 0x27
40 DW_OP_skip = 0x2F
41 DW_OP_bra = 0x28
42 DW_OP_eq = 0x29
43 DW_OP_ge = 0x2A
44 DW_OP_gt = 0x2B
45 DW_OP_le = 0x2C
46 DW_OP_lt = 0x2D
47 DW_OP_ne = 0x2E
48 DW_OP_lit0 = 0x30
49 DW_OP_lit1 = 0x31
50 DW_OP_lit2 = 0x32
51 DW_OP_lit3 = 0x33
52 DW_OP_lit4 = 0x34
53 DW_OP_lit5 = 0x35
54 DW_OP_lit6 = 0x36
55 DW_OP_lit7 = 0x37
56 DW_OP_lit8 = 0x38
57 DW_OP_lit9 = 0x39
58 DW_OP_lit10 = 0x3A
59 DW_OP_lit11 = 0x3B
60 DW_OP_lit12 = 0x3C
61 DW_OP_lit13 = 0x3D
62 DW_OP_lit14 = 0x3E
63 DW_OP_lit15 = 0x3F
64 DW_OP_lit16 = 0x40
65 DW_OP_lit17 = 0x41
66 DW_OP_lit18 = 0x42
67 DW_OP_lit19 = 0x43
68 DW_OP_lit20 = 0x44
69 DW_OP_lit21 = 0x45
70 DW_OP_lit22 = 0x46
71 DW_OP_lit23 = 0x47
72 DW_OP_lit24 = 0x48
73 DW_OP_lit25 = 0x49
74 DW_OP_lit26 = 0x4A
75 DW_OP_lit27 = 0x4B
76 DW_OP_lit28 = 0x4C
77 DW_OP_lit29 = 0x4D
78 DW_OP_lit30 = 0x4E
79 DW_OP_lit31 = 0x4F
80 DW_OP_reg0 = 0x50
81 DW_OP_reg1 = 0x51
82 DW_OP_reg2 = 0x52
83 DW_OP_reg3 = 0x53
84 DW_OP_reg4 = 0x54
85 DW_OP_reg5 = 0x55
86 DW_OP_reg6 = 0x56
87 DW_OP_reg7 = 0x57
88 DW_OP_reg8 = 0x58
89 DW_OP_reg9 = 0x59
90 DW_OP_reg10 = 0x5A
91 DW_OP_reg11 = 0x5B
92 DW_OP_reg12 = 0x5C
93 DW_OP_reg13 = 0x5D
94 DW_OP_reg14 = 0x5E
95 DW_OP_reg15 = 0x5F
96 DW_OP_reg16 = 0x60
97 DW_OP_reg17 = 0x61
98 DW_OP_reg18 = 0x62
99 DW_OP_reg19 = 0x63
100 DW_OP_reg20 = 0x64
101 DW_OP_reg21 = 0x65
102 DW_OP_reg22 = 0x66
103 DW_OP_reg23 = 0x67
104 DW_OP_reg24 = 0x68
105 DW_OP_reg25 = 0x69
106 DW_OP_reg26 = 0x6A
107 DW_OP_reg27 = 0x6B
108 DW_OP_reg28 = 0x6C
109 DW_OP_reg29 = 0x6D
110 DW_OP_reg30 = 0x6E
111 DW_OP_reg31 = 0x6F
112 DW_OP_breg0 = 0x70
113 DW_OP_breg1 = 0x71
114 DW_OP_breg2 = 0x72
115 DW_OP_breg3 = 0x73
116 DW_OP_breg4 = 0x74
117 DW_OP_breg5 = 0x75
118 DW_OP_breg6 = 0x76
119 DW_OP_breg7 = 0x77
120 DW_OP_breg8 = 0x78
121 DW_OP_breg9 = 0x79
122 DW_OP_breg10 = 0x7A
123 DW_OP_breg11 = 0x7B
124 DW_OP_breg12 = 0x7C
125 DW_OP_breg13 = 0x7D
126 DW_OP_breg14 = 0x7E
127 DW_OP_breg15 = 0x7F
128 DW_OP_breg16 = 0x80
129 DW_OP_breg17 = 0x81
130 DW_OP_breg18 = 0x82
131 DW_OP_breg19 = 0x83
132 DW_OP_breg20 = 0x84
133 DW_OP_breg21 = 0x85
134 DW_OP_breg22 = 0x86
135 DW_OP_breg23 = 0x87
136 DW_OP_breg24 = 0x88
137 DW_OP_breg25 = 0x89
138 DW_OP_breg26 = 0x8A
139 DW_OP_breg27 = 0x8B
140 DW_OP_breg28 = 0x8C
141 DW_OP_breg29 = 0x8D
142 DW_OP_breg30 = 0x8E
143 DW_OP_breg31 = 0x8F
144 DW_OP_regx = 0x90
145 DW_OP_fbreg = 0x91
146 DW_OP_bregx = 0x92
147 DW_OP_piece = 0x93
148 DW_OP_deref_size = 0x94
149 DW_OP_xderef_size = 0x95
150 DW_OP_nop = 0x96
151 DW_OP_push_object_address = 0x97
152 DW_OP_call2 = 0x98
153 DW_OP_call4 = 0x99
154 DW_OP_call_ref = 0x9A
155 DW_OP_form_tls_address = 0x9B
156 DW_OP_call_frame_cfa = 0x9C
157 DW_OP_bit_piece = 0x9D
158 DW_OP_implicit_value = 0x9E
159 DW_OP_stack_value = 0x9F
160 DW_OP_lo_user = 0xE0
161 DW_OP_GNU_push_tls_address = 0xE0
162 DW_OP_hi_user = 0xFF
165 class DwarfOpcodeParser(object):
166 def updateRegInfoBitsize(self, reg_info, byte_order):
167 """Update the regInfo bit size."""
169 # Evaluate Dwarf Expression
170 expr_result = self.evaluateDwarfExpression(
171 reg_info["dynamic_size_dwarf_expr_bytes"], byte_order
174 if expr_result == 0:
175 reg_info["bitsize"] = 32
176 elif expr_result == 1:
177 reg_info["bitsize"] = 64
179 def evaluateDwarfExpression(self, dwarf_opcode, byte_order):
180 """Evaluate Dwarf Expression."""
182 dwarf_opcode = [dwarf_opcode[i : i + 2] for i in range(0, len(dwarf_opcode), 2)]
183 dwarf_data = []
184 for index in range(len(dwarf_opcode)):
185 if index < len(dwarf_opcode):
186 val = int(dwarf_opcode[index], 16)
187 else:
188 break
190 if val == DW_OP_regx:
191 # Read register number
192 self.assertTrue(len(dwarf_opcode) > (index + 1))
193 reg_no = int(dwarf_opcode.pop(index + 1), 16)
195 self.reset_test_sequence()
196 # Read register value
197 self.test_sequence.add_log_lines(
199 "read packet: $p{0:x}#00".format(reg_no),
201 "direction": "send",
202 "regex": r"^\$([0-9a-fA-F]+)#",
203 "capture": {1: "p_response"},
206 True,
209 Context = self.expect_gdbremote_sequence()
210 self.assertIsNotNone(Context)
211 p_response = Context.get("p_response")
212 self.assertIsNotNone(p_response)
214 if byte_order == lldb.eByteOrderLittle:
215 # In case of little endian
216 # first decode the HEX ASCII bytes and then reverse it
217 # to get actual value of SR register
218 p_response = "".join(
219 reversed(
221 p_response[i : i + 2]
222 for i in range(0, len(p_response), 2)
226 # Push register value
227 dwarf_data.append(int(p_response, 16))
229 elif val == DW_OP_lit1:
230 # Push literal 1
231 dwarf_data.append(1)
233 elif val == DW_OP_lit26:
234 # Push literal 26
235 dwarf_data.append(26)
237 elif val == DW_OP_shl:
238 # left shift and push the result back
239 self.assertTrue(len(dwarf_data) > 1)
240 shift_amount = dwarf_data.pop()
241 val_to_shift = dwarf_data.pop()
242 result = val_to_shift << shift_amount
243 dwarf_data.append(result)
245 elif val == DW_OP_shr:
246 # Right shift and push the result back
247 self.assertTrue(len(dwarf_data) > 1)
248 shift_amount = dwarf_data.pop()
249 val_to_shift = dwarf_data.pop()
250 result = val_to_shift >> shift_amount
251 dwarf_data.append(result)
253 elif val == DW_OP_and:
254 # And of topmost 2 elements and push the result back
255 first_ele = dwarf_data.pop()
256 second_ele = dwarf_data.pop()
257 result = first_ele & second_ele
258 dwarf_data.append(result)
260 else:
261 self.assertTrue(False and "Unprocess Dwarf Opcode")
263 self.assertTrue(len(dwarf_data) == 1)
264 expr_result = dwarf_data.pop()
265 return expr_result