1 //===-- DWARFLocationExpression.cpp -----------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "DWARFLocationExpression.h"
12 #include "Plugins/Process/Utility/lldb-x86-register-enums.h"
13 #include "lldb/Core/Module.h"
14 #include "lldb/Core/Section.h"
15 #include "lldb/Core/StreamBuffer.h"
16 #include "lldb/Expression/DWARFExpression.h"
17 #include "lldb/Utility/ArchSpec.h"
18 #include "lldb/Utility/DataBufferHeap.h"
20 #include "llvm/BinaryFormat/Dwarf.h"
21 #include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
22 #include "llvm/DebugInfo/CodeView/TypeIndex.h"
23 #include "llvm/DebugInfo/PDB/Native/TpiStream.h"
24 #include "llvm/Support/Endian.h"
29 using namespace lldb_private;
30 using namespace lldb_private::npdb;
31 using namespace llvm::codeview;
32 using namespace llvm::pdb;
34 static const uint32_t g_code_view_to_lldb_registers_x86[] = {
35 LLDB_INVALID_REGNUM, // NONE
66 LLDB_INVALID_REGNUM, // IP
67 LLDB_INVALID_REGNUM, // FLAGS
69 lldb_eflags_i386, // EFLAGS
70 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
71 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
72 LLDB_INVALID_REGNUM, // TEMP
73 LLDB_INVALID_REGNUM, // TEMPH
74 LLDB_INVALID_REGNUM, // QUOTE
75 LLDB_INVALID_REGNUM, // PCDR3
76 LLDB_INVALID_REGNUM, // PCDR4
77 LLDB_INVALID_REGNUM, // PCDR5
78 LLDB_INVALID_REGNUM, // PCDR6
79 LLDB_INVALID_REGNUM, // PCDR7
80 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
81 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
82 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
83 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
84 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
85 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
86 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
87 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
88 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
89 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
90 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
91 LLDB_INVALID_REGNUM, // CR0
92 LLDB_INVALID_REGNUM, // CR1
93 LLDB_INVALID_REGNUM, // CR2
94 LLDB_INVALID_REGNUM, // CR3
95 LLDB_INVALID_REGNUM, // CR4
96 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
97 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
100 lldb_dr2_i386, // DR2
101 lldb_dr3_i386, // DR3
102 lldb_dr4_i386, // DR4
103 lldb_dr5_i386, // DR5
104 lldb_dr6_i386, // DR6
105 lldb_dr7_i386, // DR7
106 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
107 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
108 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
109 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
110 LLDB_INVALID_REGNUM, // GDTR
111 LLDB_INVALID_REGNUM, // GDTL
112 LLDB_INVALID_REGNUM, // IDTR
113 LLDB_INVALID_REGNUM, // IDTL
114 LLDB_INVALID_REGNUM, // LDTR
115 LLDB_INVALID_REGNUM, // TR
116 LLDB_INVALID_REGNUM, // PSEUDO1
117 LLDB_INVALID_REGNUM, // PSEUDO2
118 LLDB_INVALID_REGNUM, // PSEUDO3
119 LLDB_INVALID_REGNUM, // PSEUDO4
120 LLDB_INVALID_REGNUM, // PSEUDO5
121 LLDB_INVALID_REGNUM, // PSEUDO6
122 LLDB_INVALID_REGNUM, // PSEUDO7
123 LLDB_INVALID_REGNUM, // PSEUDO8
124 LLDB_INVALID_REGNUM, // PSEUDO9
125 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
126 lldb_st0_i386, // ST0
127 lldb_st1_i386, // ST1
128 lldb_st2_i386, // ST2
129 lldb_st3_i386, // ST3
130 lldb_st4_i386, // ST4
131 lldb_st5_i386, // ST5
132 lldb_st6_i386, // ST6
133 lldb_st7_i386, // ST7
134 LLDB_INVALID_REGNUM, // CTRL
135 LLDB_INVALID_REGNUM, // STAT
136 LLDB_INVALID_REGNUM, // TAG
137 LLDB_INVALID_REGNUM, // FPIP
138 LLDB_INVALID_REGNUM, // FPCS
139 LLDB_INVALID_REGNUM, // FPDO
140 LLDB_INVALID_REGNUM, // FPDS
141 LLDB_INVALID_REGNUM, // ISEM
142 LLDB_INVALID_REGNUM, // FPEIP
143 LLDB_INVALID_REGNUM, // FPEDO
144 lldb_mm0_i386, // MM0
145 lldb_mm1_i386, // MM1
146 lldb_mm2_i386, // MM2
147 lldb_mm3_i386, // MM3
148 lldb_mm4_i386, // MM4
149 lldb_mm5_i386, // MM5
150 lldb_mm6_i386, // MM6
151 lldb_mm7_i386, // MM7
152 lldb_xmm0_i386, // XMM0
153 lldb_xmm1_i386, // XMM1
154 lldb_xmm2_i386, // XMM2
155 lldb_xmm3_i386, // XMM3
156 lldb_xmm4_i386, // XMM4
157 lldb_xmm5_i386, // XMM5
158 lldb_xmm6_i386, // XMM6
159 lldb_xmm7_i386 // XMM7
162 static const uint32_t g_code_view_to_lldb_registers_x86_64[] = {
163 LLDB_INVALID_REGNUM, // NONE
164 lldb_al_x86_64, // AL
165 lldb_cl_x86_64, // CL
166 lldb_dl_x86_64, // DL
167 lldb_bl_x86_64, // BL
168 lldb_ah_x86_64, // AH
169 lldb_ch_x86_64, // CH
170 lldb_dh_x86_64, // DH
171 lldb_bh_x86_64, // BH
172 lldb_ax_x86_64, // AX
173 lldb_cx_x86_64, // CX
174 lldb_dx_x86_64, // DX
175 lldb_bx_x86_64, // BX
176 lldb_sp_x86_64, // SP
177 lldb_bp_x86_64, // BP
178 lldb_si_x86_64, // SI
179 lldb_di_x86_64, // DI
180 lldb_eax_x86_64, // EAX
181 lldb_ecx_x86_64, // ECX
182 lldb_edx_x86_64, // EDX
183 lldb_ebx_x86_64, // EBX
184 lldb_esp_x86_64, // ESP
185 lldb_ebp_x86_64, // EBP
186 lldb_esi_x86_64, // ESI
187 lldb_edi_x86_64, // EDI
188 lldb_es_x86_64, // ES
189 lldb_cs_x86_64, // CS
190 lldb_ss_x86_64, // SS
191 lldb_ds_x86_64, // DS
192 lldb_fs_x86_64, // FS
193 lldb_gs_x86_64, // GS
194 LLDB_INVALID_REGNUM, // IP
195 LLDB_INVALID_REGNUM, // FLAGS
196 LLDB_INVALID_REGNUM, // EIP
197 LLDB_INVALID_REGNUM, // EFLAGS
198 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
199 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
200 LLDB_INVALID_REGNUM, // TEMP
201 LLDB_INVALID_REGNUM, // TEMPH
202 LLDB_INVALID_REGNUM, // QUOTE
203 LLDB_INVALID_REGNUM, // PCDR3
204 LLDB_INVALID_REGNUM, // PCDR4
205 LLDB_INVALID_REGNUM, // PCDR5
206 LLDB_INVALID_REGNUM, // PCDR6
207 LLDB_INVALID_REGNUM, // PCDR7
208 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
209 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
210 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
211 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
212 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
213 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
214 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
215 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
216 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
217 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
218 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
219 LLDB_INVALID_REGNUM, // CR0
220 LLDB_INVALID_REGNUM, // CR1
221 LLDB_INVALID_REGNUM, // CR2
222 LLDB_INVALID_REGNUM, // CR3
223 LLDB_INVALID_REGNUM, // CR4
224 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
225 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
226 lldb_dr0_x86_64, // DR0
227 lldb_dr1_x86_64, // DR1
228 lldb_dr2_x86_64, // DR2
229 lldb_dr3_x86_64, // DR3
230 lldb_dr4_x86_64, // DR4
231 lldb_dr5_x86_64, // DR5
232 lldb_dr6_x86_64, // DR6
233 lldb_dr7_x86_64, // DR7
234 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
235 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
236 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
237 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
238 LLDB_INVALID_REGNUM, // GDTR
239 LLDB_INVALID_REGNUM, // GDTL
240 LLDB_INVALID_REGNUM, // IDTR
241 LLDB_INVALID_REGNUM, // IDTL
242 LLDB_INVALID_REGNUM, // LDTR
243 LLDB_INVALID_REGNUM, // TR
244 LLDB_INVALID_REGNUM, // PSEUDO1
245 LLDB_INVALID_REGNUM, // PSEUDO2
246 LLDB_INVALID_REGNUM, // PSEUDO3
247 LLDB_INVALID_REGNUM, // PSEUDO4
248 LLDB_INVALID_REGNUM, // PSEUDO5
249 LLDB_INVALID_REGNUM, // PSEUDO6
250 LLDB_INVALID_REGNUM, // PSEUDO7
251 LLDB_INVALID_REGNUM, // PSEUDO8
252 LLDB_INVALID_REGNUM, // PSEUDO9
253 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
254 lldb_st0_x86_64, // ST0
255 lldb_st1_x86_64, // ST1
256 lldb_st2_x86_64, // ST2
257 lldb_st3_x86_64, // ST3
258 lldb_st4_x86_64, // ST4
259 lldb_st5_x86_64, // ST5
260 lldb_st6_x86_64, // ST6
261 lldb_st7_x86_64, // ST7
262 LLDB_INVALID_REGNUM, // CTRL
263 LLDB_INVALID_REGNUM, // STAT
264 LLDB_INVALID_REGNUM, // TAG
265 LLDB_INVALID_REGNUM, // FPIP
266 LLDB_INVALID_REGNUM, // FPCS
267 LLDB_INVALID_REGNUM, // FPDO
268 LLDB_INVALID_REGNUM, // FPDS
269 LLDB_INVALID_REGNUM, // ISEM
270 LLDB_INVALID_REGNUM, // FPEIP
271 LLDB_INVALID_REGNUM, // FPEDO
272 lldb_mm0_x86_64, // MM0
273 lldb_mm1_x86_64, // MM1
274 lldb_mm2_x86_64, // MM2
275 lldb_mm3_x86_64, // MM3
276 lldb_mm4_x86_64, // MM4
277 lldb_mm5_x86_64, // MM5
278 lldb_mm6_x86_64, // MM6
279 lldb_mm7_x86_64, // MM7
280 lldb_xmm0_x86_64, // XMM0
281 lldb_xmm1_x86_64, // XMM1
282 lldb_xmm2_x86_64, // XMM2
283 lldb_xmm3_x86_64, // XMM3
284 lldb_xmm4_x86_64, // XMM4
285 lldb_xmm5_x86_64, // XMM5
286 lldb_xmm6_x86_64, // XMM6
287 lldb_xmm7_x86_64, // XMM7
288 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
289 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
290 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
291 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
292 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
293 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
294 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
295 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
296 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
297 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
298 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
299 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
300 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
301 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
302 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
303 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
305 lldb_mxcsr_x86_64, // MXCSR
306 LLDB_INVALID_REGNUM, // EDXEAX
307 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
308 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
310 LLDB_INVALID_REGNUM, // EMM0L
311 LLDB_INVALID_REGNUM, // EMM1L
312 LLDB_INVALID_REGNUM, // EMM2L
313 LLDB_INVALID_REGNUM, // EMM3L
314 LLDB_INVALID_REGNUM, // EMM4L
315 LLDB_INVALID_REGNUM, // EMM5L
316 LLDB_INVALID_REGNUM, // EMM6L
317 LLDB_INVALID_REGNUM, // EMM7L
318 LLDB_INVALID_REGNUM, // EMM0H
319 LLDB_INVALID_REGNUM, // EMM1H
320 LLDB_INVALID_REGNUM, // EMM2H
321 LLDB_INVALID_REGNUM, // EMM3H
322 LLDB_INVALID_REGNUM, // EMM4H
323 LLDB_INVALID_REGNUM, // EMM5H
324 LLDB_INVALID_REGNUM, // EMM6H
325 LLDB_INVALID_REGNUM, // EMM7H
326 LLDB_INVALID_REGNUM, // MM00
327 LLDB_INVALID_REGNUM, // MM01
328 LLDB_INVALID_REGNUM, // MM10
329 LLDB_INVALID_REGNUM, // MM11
330 LLDB_INVALID_REGNUM, // MM20
331 LLDB_INVALID_REGNUM, // MM21
332 LLDB_INVALID_REGNUM, // MM30
333 LLDB_INVALID_REGNUM, // MM31
334 LLDB_INVALID_REGNUM, // MM40
335 LLDB_INVALID_REGNUM, // MM41
336 LLDB_INVALID_REGNUM, // MM50
337 LLDB_INVALID_REGNUM, // MM51
338 LLDB_INVALID_REGNUM, // MM60
339 LLDB_INVALID_REGNUM, // MM61
340 LLDB_INVALID_REGNUM, // MM70
341 LLDB_INVALID_REGNUM, // MM71
342 lldb_xmm8_x86_64, // XMM8
343 lldb_xmm9_x86_64, // XMM9
344 lldb_xmm10_x86_64, // XMM10
345 lldb_xmm11_x86_64, // XMM11
346 lldb_xmm12_x86_64, // XMM12
347 lldb_xmm13_x86_64, // XMM13
348 lldb_xmm14_x86_64, // XMM14
349 lldb_xmm15_x86_64, // XMM15
350 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
351 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
352 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
353 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
354 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
355 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
356 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
357 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
358 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
359 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
360 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
361 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
362 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
363 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
364 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
365 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
366 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
367 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
368 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
369 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
370 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
372 lldb_sil_x86_64, // SIL
373 lldb_dil_x86_64, // DIL
374 lldb_bpl_x86_64, // BPL
375 lldb_spl_x86_64, // SPL
376 lldb_rax_x86_64, // RAX
377 lldb_rbx_x86_64, // RBX
378 lldb_rcx_x86_64, // RCX
379 lldb_rdx_x86_64, // RDX
380 lldb_rsi_x86_64, // RSI
381 lldb_rdi_x86_64, // RDI
382 lldb_rbp_x86_64, // RBP
383 lldb_rsp_x86_64, // RSP
384 lldb_r8_x86_64, // R8
385 lldb_r9_x86_64, // R9
386 lldb_r10_x86_64, // R10
387 lldb_r11_x86_64, // R11
388 lldb_r12_x86_64, // R12
389 lldb_r13_x86_64, // R13
390 lldb_r14_x86_64, // R14
391 lldb_r15_x86_64, // R15
392 lldb_r8l_x86_64, // R8B
393 lldb_r9l_x86_64, // R9B
394 lldb_r10l_x86_64, // R10B
395 lldb_r11l_x86_64, // R11B
396 lldb_r12l_x86_64, // R12B
397 lldb_r13l_x86_64, // R13B
398 lldb_r14l_x86_64, // R14B
399 lldb_r15l_x86_64, // R15B
400 lldb_r8w_x86_64, // R8W
401 lldb_r9w_x86_64, // R9W
402 lldb_r10w_x86_64, // R10W
403 lldb_r11w_x86_64, // R11W
404 lldb_r12w_x86_64, // R12W
405 lldb_r13w_x86_64, // R13W
406 lldb_r14w_x86_64, // R14W
407 lldb_r15w_x86_64, // R15W
408 lldb_r8d_x86_64, // R8D
409 lldb_r9d_x86_64, // R9D
410 lldb_r10d_x86_64, // R10D
411 lldb_r11d_x86_64, // R11D
412 lldb_r12d_x86_64, // R12D
413 lldb_r13d_x86_64, // R13D
414 lldb_r14d_x86_64, // R14D
415 lldb_r15d_x86_64, // R15D
416 lldb_ymm0_x86_64, // AMD64_YMM0
417 lldb_ymm1_x86_64, // AMD64_YMM1
418 lldb_ymm2_x86_64, // AMD64_YMM2
419 lldb_ymm3_x86_64, // AMD64_YMM3
420 lldb_ymm4_x86_64, // AMD64_YMM4
421 lldb_ymm5_x86_64, // AMD64_YMM5
422 lldb_ymm6_x86_64, // AMD64_YMM6
423 lldb_ymm7_x86_64, // AMD64_YMM7
424 lldb_ymm8_x86_64, // AMD64_YMM8
425 lldb_ymm9_x86_64, // AMD64_YMM9
426 lldb_ymm10_x86_64, // AMD64_YMM10
427 lldb_ymm11_x86_64, // AMD64_YMM11
428 lldb_ymm12_x86_64, // AMD64_YMM12
429 lldb_ymm13_x86_64, // AMD64_YMM13
430 lldb_ymm14_x86_64, // AMD64_YMM14
431 lldb_ymm15_x86_64, // AMD64_YMM15
432 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
433 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
434 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
435 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
436 lldb_bnd0_x86_64, // BND0
437 lldb_bnd1_x86_64, // BND1
438 lldb_bnd2_x86_64 // BND2
441 uint32_t GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type,
442 llvm::codeview::RegisterId register_id) {
444 case llvm::Triple::x86:
445 if (static_cast<uint16_t>(register_id) <
446 sizeof(g_code_view_to_lldb_registers_x86) /
447 sizeof(g_code_view_to_lldb_registers_x86[0]))
448 return g_code_view_to_lldb_registers_x86[static_cast<uint16_t>(
451 switch (register_id) {
452 case llvm::codeview::RegisterId::MXCSR:
453 return lldb_mxcsr_i386;
454 case llvm::codeview::RegisterId::BND0:
455 return lldb_bnd0_i386;
456 case llvm::codeview::RegisterId::BND1:
457 return lldb_bnd1_i386;
458 case llvm::codeview::RegisterId::BND2:
459 return lldb_bnd2_i386;
461 return LLDB_INVALID_REGNUM;
463 case llvm::Triple::x86_64:
464 if (static_cast<uint16_t>(register_id) <
465 sizeof(g_code_view_to_lldb_registers_x86_64) /
466 sizeof(g_code_view_to_lldb_registers_x86_64[0]))
467 return g_code_view_to_lldb_registers_x86_64[static_cast<uint16_t>(
470 return LLDB_INVALID_REGNUM;
472 return LLDB_INVALID_REGNUM;
476 uint32_t GetGenericRegisterNumber(llvm::codeview::RegisterId register_id) {
477 if (register_id == llvm::codeview::RegisterId::VFRAME)
478 return LLDB_REGNUM_GENERIC_FP;
480 return LLDB_INVALID_REGNUM;
483 static uint32_t GetRegisterNumber(llvm::Triple::ArchType arch_type,
484 llvm::codeview::RegisterId register_id,
485 RegisterKind ®ister_kind) {
486 register_kind = eRegisterKindLLDB;
487 uint32_t reg_num = GetLLDBRegisterNumber(arch_type, register_id);
488 if (reg_num != LLDB_INVALID_REGNUM)
491 register_kind = eRegisterKindGeneric;
492 return GetGenericRegisterNumber(register_id);
495 static bool IsSimpleTypeSignedInteger(SimpleTypeKind kind) {
497 case SimpleTypeKind::Int128:
498 case SimpleTypeKind::Int64:
499 case SimpleTypeKind::Int64Quad:
500 case SimpleTypeKind::Int32:
501 case SimpleTypeKind::Int32Long:
502 case SimpleTypeKind::Int16:
503 case SimpleTypeKind::Int16Short:
504 case SimpleTypeKind::Float128:
505 case SimpleTypeKind::Float80:
506 case SimpleTypeKind::Float64:
507 case SimpleTypeKind::Float32:
508 case SimpleTypeKind::Float16:
509 case SimpleTypeKind::NarrowCharacter:
510 case SimpleTypeKind::SignedCharacter:
511 case SimpleTypeKind::SByte:
518 static std::pair<size_t, bool> GetIntegralTypeInfo(TypeIndex ti,
521 SimpleTypeKind stk = ti.getSimpleKind();
522 return {GetTypeSizeForSimpleKind(stk), IsSimpleTypeSignedInteger(stk)};
525 CVType cvt = tpi.getType(ti);
526 switch (cvt.kind()) {
529 llvm::cantFail(TypeDeserializer::deserializeAs<ModifierRecord>(cvt, mfr));
530 return GetIntegralTypeInfo(mfr.ModifiedType, tpi);
534 llvm::cantFail(TypeDeserializer::deserializeAs<PointerRecord>(cvt, pr));
535 return GetIntegralTypeInfo(pr.ReferentType, tpi);
539 llvm::cantFail(TypeDeserializer::deserializeAs<EnumRecord>(cvt, er));
540 return GetIntegralTypeInfo(er.UnderlyingType, tpi);
543 assert(false && "Type is not integral!");
548 template <typename StreamWriter>
549 static DWARFExpression MakeLocationExpressionInternal(lldb::ModuleSP module,
550 StreamWriter &&writer) {
551 const ArchSpec &architecture = module->GetArchitecture();
552 ByteOrder byte_order = architecture.GetByteOrder();
553 uint32_t address_size = architecture.GetAddressByteSize();
554 uint32_t byte_size = architecture.GetDataByteSize();
555 if (byte_order == eByteOrderInvalid || address_size == 0)
556 return DWARFExpression(nullptr);
558 RegisterKind register_kind = eRegisterKindDWARF;
559 StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order);
561 if (!writer(stream, register_kind))
562 return DWARFExpression(nullptr);
564 DataBufferSP buffer =
565 std::make_shared<DataBufferHeap>(stream.GetData(), stream.GetSize());
566 DataExtractor extractor(buffer, byte_order, address_size, byte_size);
567 DWARFExpression result(module, extractor, nullptr, 0, buffer->GetByteSize());
568 result.SetRegisterKind(register_kind);
573 static DWARFExpression MakeRegisterBasedLocationExpressionInternal(
574 llvm::codeview::RegisterId reg, llvm::Optional<int32_t> relative_offset,
575 lldb::ModuleSP module) {
576 return MakeLocationExpressionInternal(
577 module, [&](Stream &stream, RegisterKind ®ister_kind) -> bool {
578 uint32_t reg_num = GetRegisterNumber(
579 module->GetArchitecture().GetMachine(), reg, register_kind);
580 if (reg_num == LLDB_INVALID_REGNUM)
584 llvm::dwarf::LocationAtom base = relative_offset
585 ? llvm::dwarf::DW_OP_bregx
586 : llvm::dwarf::DW_OP_regx;
587 stream.PutHex8(base);
588 stream.PutULEB128(reg_num);
590 llvm::dwarf::LocationAtom base = relative_offset
591 ? llvm::dwarf::DW_OP_breg0
592 : llvm::dwarf::DW_OP_reg0;
593 stream.PutHex8(base + reg_num);
597 stream.PutSLEB128(*relative_offset);
603 DWARFExpression lldb_private::npdb::MakeEnregisteredLocationExpression(
604 llvm::codeview::RegisterId reg, lldb::ModuleSP module) {
605 return MakeRegisterBasedLocationExpressionInternal(reg, llvm::None, module);
608 DWARFExpression lldb_private::npdb::MakeRegRelLocationExpression(
609 llvm::codeview::RegisterId reg, int32_t offset, lldb::ModuleSP module) {
610 return MakeRegisterBasedLocationExpressionInternal(reg, offset, module);
613 DWARFExpression lldb_private::npdb::MakeGlobalLocationExpression(
614 uint16_t section, uint32_t offset, ModuleSP module) {
618 return MakeLocationExpressionInternal(
619 module, [&](Stream &stream, RegisterKind ®ister_kind) -> bool {
620 stream.PutHex8(llvm::dwarf::DW_OP_addr);
622 SectionList *section_list = module->GetSectionList();
623 assert(section_list);
625 // Section indices in PDB are 1-based, but in DWARF they are 0-based, so
626 // we need to subtract 1.
627 uint32_t section_idx = section - 1;
628 if (section_idx >= section_list->GetSize())
631 auto section_ptr = section_list->GetSectionAtIndex(section_idx);
635 stream.PutMaxHex64(section_ptr->GetFileAddress() + offset,
636 stream.GetAddressByteSize(), stream.GetByteOrder());
642 DWARFExpression lldb_private::npdb::MakeConstantLocationExpression(
643 TypeIndex underlying_ti, TpiStream &tpi, const llvm::APSInt &constant,
645 const ArchSpec &architecture = module->GetArchitecture();
646 uint32_t address_size = architecture.GetAddressByteSize();
649 bool is_signed = false;
650 std::tie(size, is_signed) = GetIntegralTypeInfo(underlying_ti, tpi);
653 llvm::support::little64_t I;
654 llvm::support::ulittle64_t U;
657 std::shared_ptr<DataBufferHeap> buffer = std::make_shared<DataBufferHeap>();
658 buffer->SetByteSize(size);
660 llvm::ArrayRef<uint8_t> bytes;
662 Value.I = constant.getSExtValue();
664 Value.U = constant.getZExtValue();
667 bytes = llvm::makeArrayRef(reinterpret_cast<const uint8_t *>(&Value), 8)
669 buffer->CopyData(bytes.data(), size);
670 DataExtractor extractor(buffer, lldb::eByteOrderLittle, address_size);
671 DWARFExpression result(nullptr, extractor, nullptr, 0, size);