1 //===-- PDBLocationToDWARFExpression.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 "PDBLocationToDWARFExpression.h"
12 #include "lldb/Core/Section.h"
13 #include "lldb/Core/StreamBuffer.h"
14 #include "lldb/Core/dwarf.h"
15 #include "lldb/Expression/DWARFExpression.h"
16 #include "lldb/Utility/DataBufferHeap.h"
18 #include "llvm/DebugInfo/CodeView/CodeView.h"
19 #include "llvm/DebugInfo/PDB/PDBSymbolData.h"
21 #include "Plugins/Process/Utility/lldb-x86-register-enums.h"
24 using namespace lldb_private;
25 using namespace llvm::pdb;
28 const uint32_t g_code_view_to_lldb_registers_x86[] = {
29 LLDB_INVALID_REGNUM, // NONE
60 LLDB_INVALID_REGNUM, // IP
61 LLDB_INVALID_REGNUM, // FLAGS
63 lldb_eflags_i386, // EFLAGS
64 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
65 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
66 LLDB_INVALID_REGNUM, // TEMP
67 LLDB_INVALID_REGNUM, // TEMPH
68 LLDB_INVALID_REGNUM, // QUOTE
69 LLDB_INVALID_REGNUM, // PCDR3
70 LLDB_INVALID_REGNUM, // PCDR4
71 LLDB_INVALID_REGNUM, // PCDR5
72 LLDB_INVALID_REGNUM, // PCDR6
73 LLDB_INVALID_REGNUM, // PCDR7
74 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
75 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
76 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
77 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
78 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
79 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
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,
85 LLDB_INVALID_REGNUM, // CR0
86 LLDB_INVALID_REGNUM, // CR1
87 LLDB_INVALID_REGNUM, // CR2
88 LLDB_INVALID_REGNUM, // CR3
89 LLDB_INVALID_REGNUM, // CR4
90 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
91 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
100 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
101 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
102 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
103 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
104 LLDB_INVALID_REGNUM, // GDTR
105 LLDB_INVALID_REGNUM, // GDTL
106 LLDB_INVALID_REGNUM, // IDTR
107 LLDB_INVALID_REGNUM, // IDTL
108 LLDB_INVALID_REGNUM, // LDTR
109 LLDB_INVALID_REGNUM, // TR
110 LLDB_INVALID_REGNUM, // PSEUDO1
111 LLDB_INVALID_REGNUM, // PSEUDO2
112 LLDB_INVALID_REGNUM, // PSEUDO3
113 LLDB_INVALID_REGNUM, // PSEUDO4
114 LLDB_INVALID_REGNUM, // PSEUDO5
115 LLDB_INVALID_REGNUM, // PSEUDO6
116 LLDB_INVALID_REGNUM, // PSEUDO7
117 LLDB_INVALID_REGNUM, // PSEUDO8
118 LLDB_INVALID_REGNUM, // PSEUDO9
119 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
120 lldb_st0_i386, // ST0
121 lldb_st1_i386, // ST1
122 lldb_st2_i386, // ST2
123 lldb_st3_i386, // ST3
124 lldb_st4_i386, // ST4
125 lldb_st5_i386, // ST5
126 lldb_st6_i386, // ST6
127 lldb_st7_i386, // ST7
128 LLDB_INVALID_REGNUM, // CTRL
129 LLDB_INVALID_REGNUM, // STAT
130 LLDB_INVALID_REGNUM, // TAG
131 LLDB_INVALID_REGNUM, // FPIP
132 LLDB_INVALID_REGNUM, // FPCS
133 LLDB_INVALID_REGNUM, // FPDO
134 LLDB_INVALID_REGNUM, // FPDS
135 LLDB_INVALID_REGNUM, // ISEM
136 LLDB_INVALID_REGNUM, // FPEIP
137 LLDB_INVALID_REGNUM, // FPEDO
138 lldb_mm0_i386, // MM0
139 lldb_mm1_i386, // MM1
140 lldb_mm2_i386, // MM2
141 lldb_mm3_i386, // MM3
142 lldb_mm4_i386, // MM4
143 lldb_mm5_i386, // MM5
144 lldb_mm6_i386, // MM6
145 lldb_mm7_i386, // MM7
146 lldb_xmm0_i386, // XMM0
147 lldb_xmm1_i386, // XMM1
148 lldb_xmm2_i386, // XMM2
149 lldb_xmm3_i386, // XMM3
150 lldb_xmm4_i386, // XMM4
151 lldb_xmm5_i386, // XMM5
152 lldb_xmm6_i386, // XMM6
153 lldb_xmm7_i386 // XMM7
156 const uint32_t g_code_view_to_lldb_registers_x86_64[] = {
157 LLDB_INVALID_REGNUM, // NONE
158 lldb_al_x86_64, // AL
159 lldb_cl_x86_64, // CL
160 lldb_dl_x86_64, // DL
161 lldb_bl_x86_64, // BL
162 lldb_ah_x86_64, // AH
163 lldb_ch_x86_64, // CH
164 lldb_dh_x86_64, // DH
165 lldb_bh_x86_64, // BH
166 lldb_ax_x86_64, // AX
167 lldb_cx_x86_64, // CX
168 lldb_dx_x86_64, // DX
169 lldb_bx_x86_64, // BX
170 lldb_sp_x86_64, // SP
171 lldb_bp_x86_64, // BP
172 lldb_si_x86_64, // SI
173 lldb_di_x86_64, // DI
174 lldb_eax_x86_64, // EAX
175 lldb_ecx_x86_64, // ECX
176 lldb_edx_x86_64, // EDX
177 lldb_ebx_x86_64, // EBX
178 lldb_esp_x86_64, // ESP
179 lldb_ebp_x86_64, // EBP
180 lldb_esi_x86_64, // ESI
181 lldb_edi_x86_64, // EDI
182 lldb_es_x86_64, // ES
183 lldb_cs_x86_64, // CS
184 lldb_ss_x86_64, // SS
185 lldb_ds_x86_64, // DS
186 lldb_fs_x86_64, // FS
187 lldb_gs_x86_64, // GS
188 LLDB_INVALID_REGNUM, // IP
189 LLDB_INVALID_REGNUM, // FLAGS
190 LLDB_INVALID_REGNUM, // EIP
191 LLDB_INVALID_REGNUM, // EFLAGS
192 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
193 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
194 LLDB_INVALID_REGNUM, // TEMP
195 LLDB_INVALID_REGNUM, // TEMPH
196 LLDB_INVALID_REGNUM, // QUOTE
197 LLDB_INVALID_REGNUM, // PCDR3
198 LLDB_INVALID_REGNUM, // PCDR4
199 LLDB_INVALID_REGNUM, // PCDR5
200 LLDB_INVALID_REGNUM, // PCDR6
201 LLDB_INVALID_REGNUM, // PCDR7
202 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
203 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
204 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
205 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
206 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
207 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
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,
213 LLDB_INVALID_REGNUM, // CR0
214 LLDB_INVALID_REGNUM, // CR1
215 LLDB_INVALID_REGNUM, // CR2
216 LLDB_INVALID_REGNUM, // CR3
217 LLDB_INVALID_REGNUM, // CR4
218 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
219 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
220 lldb_dr0_x86_64, // DR0
221 lldb_dr1_x86_64, // DR1
222 lldb_dr2_x86_64, // DR2
223 lldb_dr3_x86_64, // DR3
224 lldb_dr4_x86_64, // DR4
225 lldb_dr5_x86_64, // DR5
226 lldb_dr6_x86_64, // DR6
227 lldb_dr7_x86_64, // DR7
228 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
229 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
230 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
231 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
232 LLDB_INVALID_REGNUM, // GDTR
233 LLDB_INVALID_REGNUM, // GDTL
234 LLDB_INVALID_REGNUM, // IDTR
235 LLDB_INVALID_REGNUM, // IDTL
236 LLDB_INVALID_REGNUM, // LDTR
237 LLDB_INVALID_REGNUM, // TR
238 LLDB_INVALID_REGNUM, // PSEUDO1
239 LLDB_INVALID_REGNUM, // PSEUDO2
240 LLDB_INVALID_REGNUM, // PSEUDO3
241 LLDB_INVALID_REGNUM, // PSEUDO4
242 LLDB_INVALID_REGNUM, // PSEUDO5
243 LLDB_INVALID_REGNUM, // PSEUDO6
244 LLDB_INVALID_REGNUM, // PSEUDO7
245 LLDB_INVALID_REGNUM, // PSEUDO8
246 LLDB_INVALID_REGNUM, // PSEUDO9
247 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
248 lldb_st0_x86_64, // ST0
249 lldb_st1_x86_64, // ST1
250 lldb_st2_x86_64, // ST2
251 lldb_st3_x86_64, // ST3
252 lldb_st4_x86_64, // ST4
253 lldb_st5_x86_64, // ST5
254 lldb_st6_x86_64, // ST6
255 lldb_st7_x86_64, // ST7
256 LLDB_INVALID_REGNUM, // CTRL
257 LLDB_INVALID_REGNUM, // STAT
258 LLDB_INVALID_REGNUM, // TAG
259 LLDB_INVALID_REGNUM, // FPIP
260 LLDB_INVALID_REGNUM, // FPCS
261 LLDB_INVALID_REGNUM, // FPDO
262 LLDB_INVALID_REGNUM, // FPDS
263 LLDB_INVALID_REGNUM, // ISEM
264 LLDB_INVALID_REGNUM, // FPEIP
265 LLDB_INVALID_REGNUM, // FPEDO
266 lldb_mm0_x86_64, // MM0
267 lldb_mm1_x86_64, // MM1
268 lldb_mm2_x86_64, // MM2
269 lldb_mm3_x86_64, // MM3
270 lldb_mm4_x86_64, // MM4
271 lldb_mm5_x86_64, // MM5
272 lldb_mm6_x86_64, // MM6
273 lldb_mm7_x86_64, // MM7
274 lldb_xmm0_x86_64, // XMM0
275 lldb_xmm1_x86_64, // XMM1
276 lldb_xmm2_x86_64, // XMM2
277 lldb_xmm3_x86_64, // XMM3
278 lldb_xmm4_x86_64, // XMM4
279 lldb_xmm5_x86_64, // XMM5
280 lldb_xmm6_x86_64, // XMM6
281 lldb_xmm7_x86_64, // XMM7
282 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
283 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
284 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
285 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
286 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
287 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
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,
299 lldb_mxcsr_x86_64, // MXCSR
300 LLDB_INVALID_REGNUM, // EDXEAX
301 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
302 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
304 LLDB_INVALID_REGNUM, // EMM0L
305 LLDB_INVALID_REGNUM, // EMM1L
306 LLDB_INVALID_REGNUM, // EMM2L
307 LLDB_INVALID_REGNUM, // EMM3L
308 LLDB_INVALID_REGNUM, // EMM4L
309 LLDB_INVALID_REGNUM, // EMM5L
310 LLDB_INVALID_REGNUM, // EMM6L
311 LLDB_INVALID_REGNUM, // EMM7L
312 LLDB_INVALID_REGNUM, // EMM0H
313 LLDB_INVALID_REGNUM, // EMM1H
314 LLDB_INVALID_REGNUM, // EMM2H
315 LLDB_INVALID_REGNUM, // EMM3H
316 LLDB_INVALID_REGNUM, // EMM4H
317 LLDB_INVALID_REGNUM, // EMM5H
318 LLDB_INVALID_REGNUM, // EMM6H
319 LLDB_INVALID_REGNUM, // EMM7H
320 LLDB_INVALID_REGNUM, // MM00
321 LLDB_INVALID_REGNUM, // MM01
322 LLDB_INVALID_REGNUM, // MM10
323 LLDB_INVALID_REGNUM, // MM11
324 LLDB_INVALID_REGNUM, // MM20
325 LLDB_INVALID_REGNUM, // MM21
326 LLDB_INVALID_REGNUM, // MM30
327 LLDB_INVALID_REGNUM, // MM31
328 LLDB_INVALID_REGNUM, // MM40
329 LLDB_INVALID_REGNUM, // MM41
330 LLDB_INVALID_REGNUM, // MM50
331 LLDB_INVALID_REGNUM, // MM51
332 LLDB_INVALID_REGNUM, // MM60
333 LLDB_INVALID_REGNUM, // MM61
334 LLDB_INVALID_REGNUM, // MM70
335 LLDB_INVALID_REGNUM, // MM71
336 lldb_xmm8_x86_64, // XMM8
337 lldb_xmm9_x86_64, // XMM9
338 lldb_xmm10_x86_64, // XMM10
339 lldb_xmm11_x86_64, // XMM11
340 lldb_xmm12_x86_64, // XMM12
341 lldb_xmm13_x86_64, // XMM13
342 lldb_xmm14_x86_64, // XMM14
343 lldb_xmm15_x86_64, // XMM15
344 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
345 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
346 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
347 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
348 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
349 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
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,
366 lldb_sil_x86_64, // SIL
367 lldb_dil_x86_64, // DIL
368 lldb_bpl_x86_64, // BPL
369 lldb_spl_x86_64, // SPL
370 lldb_rax_x86_64, // RAX
371 lldb_rbx_x86_64, // RBX
372 lldb_rcx_x86_64, // RCX
373 lldb_rdx_x86_64, // RDX
374 lldb_rsi_x86_64, // RSI
375 lldb_rdi_x86_64, // RDI
376 lldb_rbp_x86_64, // RBP
377 lldb_rsp_x86_64, // RSP
378 lldb_r8_x86_64, // R8
379 lldb_r9_x86_64, // R9
380 lldb_r10_x86_64, // R10
381 lldb_r11_x86_64, // R11
382 lldb_r12_x86_64, // R12
383 lldb_r13_x86_64, // R13
384 lldb_r14_x86_64, // R14
385 lldb_r15_x86_64, // R15
386 lldb_r8l_x86_64, // R8B
387 lldb_r9l_x86_64, // R9B
388 lldb_r10l_x86_64, // R10B
389 lldb_r11l_x86_64, // R11B
390 lldb_r12l_x86_64, // R12B
391 lldb_r13l_x86_64, // R13B
392 lldb_r14l_x86_64, // R14B
393 lldb_r15l_x86_64, // R15B
394 lldb_r8w_x86_64, // R8W
395 lldb_r9w_x86_64, // R9W
396 lldb_r10w_x86_64, // R10W
397 lldb_r11w_x86_64, // R11W
398 lldb_r12w_x86_64, // R12W
399 lldb_r13w_x86_64, // R13W
400 lldb_r14w_x86_64, // R14W
401 lldb_r15w_x86_64, // R15W
402 lldb_r8d_x86_64, // R8D
403 lldb_r9d_x86_64, // R9D
404 lldb_r10d_x86_64, // R10D
405 lldb_r11d_x86_64, // R11D
406 lldb_r12d_x86_64, // R12D
407 lldb_r13d_x86_64, // R13D
408 lldb_r14d_x86_64, // R14D
409 lldb_r15d_x86_64, // R15D
410 lldb_ymm0_x86_64, // AMD64_YMM0
411 lldb_ymm1_x86_64, // AMD64_YMM1
412 lldb_ymm2_x86_64, // AMD64_YMM2
413 lldb_ymm3_x86_64, // AMD64_YMM3
414 lldb_ymm4_x86_64, // AMD64_YMM4
415 lldb_ymm5_x86_64, // AMD64_YMM5
416 lldb_ymm6_x86_64, // AMD64_YMM6
417 lldb_ymm7_x86_64, // AMD64_YMM7
418 lldb_ymm8_x86_64, // AMD64_YMM8
419 lldb_ymm9_x86_64, // AMD64_YMM9
420 lldb_ymm10_x86_64, // AMD64_YMM10
421 lldb_ymm11_x86_64, // AMD64_YMM11
422 lldb_ymm12_x86_64, // AMD64_YMM12
423 lldb_ymm13_x86_64, // AMD64_YMM13
424 lldb_ymm14_x86_64, // AMD64_YMM14
425 lldb_ymm15_x86_64, // AMD64_YMM15
426 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
427 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
428 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
429 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
430 lldb_bnd0_x86_64, // BND0
431 lldb_bnd1_x86_64, // BND1
432 lldb_bnd2_x86_64 // BND2
435 uint32_t GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type,
436 llvm::codeview::RegisterId register_id) {
438 case llvm::Triple::x86:
439 if (static_cast<uint16_t>(register_id) <
440 sizeof(g_code_view_to_lldb_registers_x86) /
441 sizeof(g_code_view_to_lldb_registers_x86[0]))
442 return g_code_view_to_lldb_registers_x86[static_cast<uint16_t>(
445 switch (register_id) {
446 case llvm::codeview::RegisterId::MXCSR:
447 return lldb_mxcsr_i386;
448 case llvm::codeview::RegisterId::BND0:
449 return lldb_bnd0_i386;
450 case llvm::codeview::RegisterId::BND1:
451 return lldb_bnd1_i386;
452 case llvm::codeview::RegisterId::BND2:
453 return lldb_bnd2_i386;
455 return LLDB_INVALID_REGNUM;
457 case llvm::Triple::x86_64:
458 if (static_cast<uint16_t>(register_id) <
459 sizeof(g_code_view_to_lldb_registers_x86_64) /
460 sizeof(g_code_view_to_lldb_registers_x86_64[0]))
461 return g_code_view_to_lldb_registers_x86_64[static_cast<uint16_t>(
464 return LLDB_INVALID_REGNUM;
466 return LLDB_INVALID_REGNUM;
470 uint32_t GetGenericRegisterNumber(llvm::codeview::RegisterId register_id) {
471 if (register_id == llvm::codeview::RegisterId::VFRAME)
472 return LLDB_REGNUM_GENERIC_FP;
474 return LLDB_INVALID_REGNUM;
477 uint32_t GetRegisterNumber(llvm::Triple::ArchType arch_type,
478 llvm::codeview::RegisterId register_id,
479 RegisterKind ®ister_kind) {
480 register_kind = eRegisterKindLLDB;
481 uint32_t reg_num = GetLLDBRegisterNumber(arch_type, register_id);
482 if (reg_num != LLDB_INVALID_REGNUM)
485 register_kind = eRegisterKindGeneric;
486 return GetGenericRegisterNumber(register_id);
490 DWARFExpression ConvertPDBLocationToDWARFExpression(ModuleSP module,
491 const PDBSymbolData &symbol,
496 return DWARFExpression(nullptr);
498 const ArchSpec &architecture = module->GetArchitecture();
499 llvm::Triple::ArchType arch_type = architecture.GetMachine();
500 ByteOrder byte_order = architecture.GetByteOrder();
501 uint32_t address_size = architecture.GetAddressByteSize();
502 uint32_t byte_size = architecture.GetDataByteSize();
503 if (byte_order == eByteOrderInvalid || address_size == 0)
504 return DWARFExpression(nullptr);
506 RegisterKind register_kind = eRegisterKindDWARF;
507 StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order);
508 switch (symbol.getLocationType()) {
509 case PDB_LocType::Static:
510 case PDB_LocType::TLS: {
511 stream.PutHex8(DW_OP_addr);
513 SectionList *section_list = module->GetSectionList();
515 return DWARFExpression(nullptr);
517 uint32_t section_idx = symbol.getAddressSection() - 1;
518 if (section_idx >= section_list->GetSize())
519 return DWARFExpression(nullptr);
521 auto section = section_list->GetSectionAtIndex(section_idx);
523 return DWARFExpression(nullptr);
525 uint32_t offset = symbol.getAddressOffset();
526 stream.PutMaxHex64(section->GetFileAddress() + offset, address_size,
533 case PDB_LocType::RegRel: {
535 GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind);
536 if (reg_num == LLDB_INVALID_REGNUM)
537 return DWARFExpression(nullptr);
540 stream.PutHex8(DW_OP_bregx);
541 stream.PutULEB128(reg_num);
543 stream.PutHex8(DW_OP_breg0 + reg_num);
545 int32_t offset = symbol.getOffset();
546 stream.PutSLEB128(offset);
552 case PDB_LocType::Enregistered: {
554 GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind);
555 if (reg_num == LLDB_INVALID_REGNUM)
556 return DWARFExpression(nullptr);
559 stream.PutHex8(DW_OP_regx);
560 stream.PutULEB128(reg_num);
562 stream.PutHex8(DW_OP_reg0 + reg_num);
568 case PDB_LocType::Constant: {
569 Variant value = symbol.getValue();
570 stream.PutRawBytes(&value.Value, sizeof(value.Value),
571 endian::InlHostByteOrder());
575 return DWARFExpression(nullptr);
578 DataBufferSP buffer =
579 std::make_shared<DataBufferHeap>(stream.GetData(), stream.GetSize());
580 DataExtractor extractor(buffer, byte_order, address_size, byte_size);
581 DWARFExpression result(module, extractor, nullptr, 0, buffer->GetByteSize());
582 result.SetRegisterKind(register_kind);