1 //===-- PDBLocationToDWARFExpression.cpp ------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "PDBLocationToDWARFExpression.h"
10 
11 #include "lldb/Core/Section.h"
12 #include "lldb/Core/StreamBuffer.h"
13 #include "lldb/Core/dwarf.h"
14 #include "lldb/Expression/DWARFExpression.h"
15 #include "lldb/Utility/DataBufferHeap.h"
16 
17 #include "llvm/DebugInfo/CodeView/CodeView.h"
18 #include "llvm/DebugInfo/PDB/PDBSymbolData.h"
19 
20 #include "Plugins/Process/Utility/lldb-x86-register-enums.h"
21 
22 using namespace lldb;
23 using namespace lldb_private;
24 using namespace llvm::pdb;
25 
26 namespace {
27 const uint32_t g_code_view_to_lldb_registers_x86[] = {
28     LLDB_INVALID_REGNUM, // NONE
29     lldb_al_i386,        // AL
30     lldb_cl_i386,        // CL
31     lldb_dl_i386,        // DL
32     lldb_bl_i386,        // BL
33     lldb_ah_i386,        // AH
34     lldb_ch_i386,        // CH
35     lldb_dh_i386,        // DH
36     lldb_bh_i386,        // BH
37     lldb_ax_i386,        // AX
38     lldb_cx_i386,        // CX
39     lldb_dx_i386,        // DX
40     lldb_bx_i386,        // BX
41     lldb_sp_i386,        // SP
42     lldb_bp_i386,        // BP
43     lldb_si_i386,        // SI
44     lldb_di_i386,        // DI
45     lldb_eax_i386,       // EAX
46     lldb_ecx_i386,       // ECX
47     lldb_edx_i386,       // EDX
48     lldb_ebx_i386,       // EBX
49     lldb_esp_i386,       // ESP
50     lldb_ebp_i386,       // EBP
51     lldb_esi_i386,       // ESI
52     lldb_edi_i386,       // EDI
53     lldb_es_i386,        // ES
54     lldb_cs_i386,        // CS
55     lldb_ss_i386,        // SS
56     lldb_ds_i386,        // DS
57     lldb_fs_i386,        // FS
58     lldb_gs_i386,        // GS
59     LLDB_INVALID_REGNUM, // IP
60     LLDB_INVALID_REGNUM, // FLAGS
61     lldb_eip_i386,       // EIP
62     lldb_eflags_i386,    // EFLAGS
63     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
64     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
65     LLDB_INVALID_REGNUM, // TEMP
66     LLDB_INVALID_REGNUM, // TEMPH
67     LLDB_INVALID_REGNUM, // QUOTE
68     LLDB_INVALID_REGNUM, // PCDR3
69     LLDB_INVALID_REGNUM, // PCDR4
70     LLDB_INVALID_REGNUM, // PCDR5
71     LLDB_INVALID_REGNUM, // PCDR6
72     LLDB_INVALID_REGNUM, // PCDR7
73     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
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,
84     LLDB_INVALID_REGNUM, // CR0
85     LLDB_INVALID_REGNUM, // CR1
86     LLDB_INVALID_REGNUM, // CR2
87     LLDB_INVALID_REGNUM, // CR3
88     LLDB_INVALID_REGNUM, // CR4
89     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
90     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
91     lldb_dr0_i386, // DR0
92     lldb_dr1_i386, // DR1
93     lldb_dr2_i386, // DR2
94     lldb_dr3_i386, // DR3
95     lldb_dr4_i386, // DR4
96     lldb_dr5_i386, // DR5
97     lldb_dr6_i386, // DR6
98     lldb_dr7_i386, // DR7
99     LLDB_INVALID_REGNUM, 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, // GDTR
104     LLDB_INVALID_REGNUM, // GDTL
105     LLDB_INVALID_REGNUM, // IDTR
106     LLDB_INVALID_REGNUM, // IDTL
107     LLDB_INVALID_REGNUM, // LDTR
108     LLDB_INVALID_REGNUM, // TR
109     LLDB_INVALID_REGNUM, // PSEUDO1
110     LLDB_INVALID_REGNUM, // PSEUDO2
111     LLDB_INVALID_REGNUM, // PSEUDO3
112     LLDB_INVALID_REGNUM, // PSEUDO4
113     LLDB_INVALID_REGNUM, // PSEUDO5
114     LLDB_INVALID_REGNUM, // PSEUDO6
115     LLDB_INVALID_REGNUM, // PSEUDO7
116     LLDB_INVALID_REGNUM, // PSEUDO8
117     LLDB_INVALID_REGNUM, // PSEUDO9
118     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
119     lldb_st0_i386,       // ST0
120     lldb_st1_i386,       // ST1
121     lldb_st2_i386,       // ST2
122     lldb_st3_i386,       // ST3
123     lldb_st4_i386,       // ST4
124     lldb_st5_i386,       // ST5
125     lldb_st6_i386,       // ST6
126     lldb_st7_i386,       // ST7
127     LLDB_INVALID_REGNUM, // CTRL
128     LLDB_INVALID_REGNUM, // STAT
129     LLDB_INVALID_REGNUM, // TAG
130     LLDB_INVALID_REGNUM, // FPIP
131     LLDB_INVALID_REGNUM, // FPCS
132     LLDB_INVALID_REGNUM, // FPDO
133     LLDB_INVALID_REGNUM, // FPDS
134     LLDB_INVALID_REGNUM, // ISEM
135     LLDB_INVALID_REGNUM, // FPEIP
136     LLDB_INVALID_REGNUM, // FPEDO
137     lldb_mm0_i386,       // MM0
138     lldb_mm1_i386,       // MM1
139     lldb_mm2_i386,       // MM2
140     lldb_mm3_i386,       // MM3
141     lldb_mm4_i386,       // MM4
142     lldb_mm5_i386,       // MM5
143     lldb_mm6_i386,       // MM6
144     lldb_mm7_i386,       // MM7
145     lldb_xmm0_i386,      // XMM0
146     lldb_xmm1_i386,      // XMM1
147     lldb_xmm2_i386,      // XMM2
148     lldb_xmm3_i386,      // XMM3
149     lldb_xmm4_i386,      // XMM4
150     lldb_xmm5_i386,      // XMM5
151     lldb_xmm6_i386,      // XMM6
152     lldb_xmm7_i386       // XMM7
153 };
154 
155 const uint32_t g_code_view_to_lldb_registers_x86_64[] = {
156     LLDB_INVALID_REGNUM, // NONE
157     lldb_al_x86_64,      // AL
158     lldb_cl_x86_64,      // CL
159     lldb_dl_x86_64,      // DL
160     lldb_bl_x86_64,      // BL
161     lldb_ah_x86_64,      // AH
162     lldb_ch_x86_64,      // CH
163     lldb_dh_x86_64,      // DH
164     lldb_bh_x86_64,      // BH
165     lldb_ax_x86_64,      // AX
166     lldb_cx_x86_64,      // CX
167     lldb_dx_x86_64,      // DX
168     lldb_bx_x86_64,      // BX
169     lldb_sp_x86_64,      // SP
170     lldb_bp_x86_64,      // BP
171     lldb_si_x86_64,      // SI
172     lldb_di_x86_64,      // DI
173     lldb_eax_x86_64,     // EAX
174     lldb_ecx_x86_64,     // ECX
175     lldb_edx_x86_64,     // EDX
176     lldb_ebx_x86_64,     // EBX
177     lldb_esp_x86_64,     // ESP
178     lldb_ebp_x86_64,     // EBP
179     lldb_esi_x86_64,     // ESI
180     lldb_edi_x86_64,     // EDI
181     lldb_es_x86_64,      // ES
182     lldb_cs_x86_64,      // CS
183     lldb_ss_x86_64,      // SS
184     lldb_ds_x86_64,      // DS
185     lldb_fs_x86_64,      // FS
186     lldb_gs_x86_64,      // GS
187     LLDB_INVALID_REGNUM, // IP
188     LLDB_INVALID_REGNUM, // FLAGS
189     LLDB_INVALID_REGNUM, // EIP
190     LLDB_INVALID_REGNUM, // EFLAGS
191     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
192     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
193     LLDB_INVALID_REGNUM, // TEMP
194     LLDB_INVALID_REGNUM, // TEMPH
195     LLDB_INVALID_REGNUM, // QUOTE
196     LLDB_INVALID_REGNUM, // PCDR3
197     LLDB_INVALID_REGNUM, // PCDR4
198     LLDB_INVALID_REGNUM, // PCDR5
199     LLDB_INVALID_REGNUM, // PCDR6
200     LLDB_INVALID_REGNUM, // PCDR7
201     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
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,
212     LLDB_INVALID_REGNUM, // CR0
213     LLDB_INVALID_REGNUM, // CR1
214     LLDB_INVALID_REGNUM, // CR2
215     LLDB_INVALID_REGNUM, // CR3
216     LLDB_INVALID_REGNUM, // CR4
217     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
218     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
219     lldb_dr0_x86_64, // DR0
220     lldb_dr1_x86_64, // DR1
221     lldb_dr2_x86_64, // DR2
222     lldb_dr3_x86_64, // DR3
223     lldb_dr4_x86_64, // DR4
224     lldb_dr5_x86_64, // DR5
225     lldb_dr6_x86_64, // DR6
226     lldb_dr7_x86_64, // DR7
227     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
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, // GDTR
232     LLDB_INVALID_REGNUM, // GDTL
233     LLDB_INVALID_REGNUM, // IDTR
234     LLDB_INVALID_REGNUM, // IDTL
235     LLDB_INVALID_REGNUM, // LDTR
236     LLDB_INVALID_REGNUM, // TR
237     LLDB_INVALID_REGNUM, // PSEUDO1
238     LLDB_INVALID_REGNUM, // PSEUDO2
239     LLDB_INVALID_REGNUM, // PSEUDO3
240     LLDB_INVALID_REGNUM, // PSEUDO4
241     LLDB_INVALID_REGNUM, // PSEUDO5
242     LLDB_INVALID_REGNUM, // PSEUDO6
243     LLDB_INVALID_REGNUM, // PSEUDO7
244     LLDB_INVALID_REGNUM, // PSEUDO8
245     LLDB_INVALID_REGNUM, // PSEUDO9
246     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
247     lldb_st0_x86_64,     // ST0
248     lldb_st1_x86_64,     // ST1
249     lldb_st2_x86_64,     // ST2
250     lldb_st3_x86_64,     // ST3
251     lldb_st4_x86_64,     // ST4
252     lldb_st5_x86_64,     // ST5
253     lldb_st6_x86_64,     // ST6
254     lldb_st7_x86_64,     // ST7
255     LLDB_INVALID_REGNUM, // CTRL
256     LLDB_INVALID_REGNUM, // STAT
257     LLDB_INVALID_REGNUM, // TAG
258     LLDB_INVALID_REGNUM, // FPIP
259     LLDB_INVALID_REGNUM, // FPCS
260     LLDB_INVALID_REGNUM, // FPDO
261     LLDB_INVALID_REGNUM, // FPDS
262     LLDB_INVALID_REGNUM, // ISEM
263     LLDB_INVALID_REGNUM, // FPEIP
264     LLDB_INVALID_REGNUM, // FPEDO
265     lldb_mm0_x86_64,     // MM0
266     lldb_mm1_x86_64,     // MM1
267     lldb_mm2_x86_64,     // MM2
268     lldb_mm3_x86_64,     // MM3
269     lldb_mm4_x86_64,     // MM4
270     lldb_mm5_x86_64,     // MM5
271     lldb_mm6_x86_64,     // MM6
272     lldb_mm7_x86_64,     // MM7
273     lldb_xmm0_x86_64,    // XMM0
274     lldb_xmm1_x86_64,    // XMM1
275     lldb_xmm2_x86_64,    // XMM2
276     lldb_xmm3_x86_64,    // XMM3
277     lldb_xmm4_x86_64,    // XMM4
278     lldb_xmm5_x86_64,    // XMM5
279     lldb_xmm6_x86_64,    // XMM6
280     lldb_xmm7_x86_64,    // XMM7
281     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
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,
298     lldb_mxcsr_x86_64,   // MXCSR
299     LLDB_INVALID_REGNUM, // EDXEAX
300     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
301     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
302     LLDB_INVALID_REGNUM,
303     LLDB_INVALID_REGNUM, // EMM0L
304     LLDB_INVALID_REGNUM, // EMM1L
305     LLDB_INVALID_REGNUM, // EMM2L
306     LLDB_INVALID_REGNUM, // EMM3L
307     LLDB_INVALID_REGNUM, // EMM4L
308     LLDB_INVALID_REGNUM, // EMM5L
309     LLDB_INVALID_REGNUM, // EMM6L
310     LLDB_INVALID_REGNUM, // EMM7L
311     LLDB_INVALID_REGNUM, // EMM0H
312     LLDB_INVALID_REGNUM, // EMM1H
313     LLDB_INVALID_REGNUM, // EMM2H
314     LLDB_INVALID_REGNUM, // EMM3H
315     LLDB_INVALID_REGNUM, // EMM4H
316     LLDB_INVALID_REGNUM, // EMM5H
317     LLDB_INVALID_REGNUM, // EMM6H
318     LLDB_INVALID_REGNUM, // EMM7H
319     LLDB_INVALID_REGNUM, // MM00
320     LLDB_INVALID_REGNUM, // MM01
321     LLDB_INVALID_REGNUM, // MM10
322     LLDB_INVALID_REGNUM, // MM11
323     LLDB_INVALID_REGNUM, // MM20
324     LLDB_INVALID_REGNUM, // MM21
325     LLDB_INVALID_REGNUM, // MM30
326     LLDB_INVALID_REGNUM, // MM31
327     LLDB_INVALID_REGNUM, // MM40
328     LLDB_INVALID_REGNUM, // MM41
329     LLDB_INVALID_REGNUM, // MM50
330     LLDB_INVALID_REGNUM, // MM51
331     LLDB_INVALID_REGNUM, // MM60
332     LLDB_INVALID_REGNUM, // MM61
333     LLDB_INVALID_REGNUM, // MM70
334     LLDB_INVALID_REGNUM, // MM71
335     lldb_xmm8_x86_64,    // XMM8
336     lldb_xmm9_x86_64,    // XMM9
337     lldb_xmm10_x86_64,   // XMM10
338     lldb_xmm11_x86_64,   // XMM11
339     lldb_xmm12_x86_64,   // XMM12
340     lldb_xmm13_x86_64,   // XMM13
341     lldb_xmm14_x86_64,   // XMM14
342     lldb_xmm15_x86_64,   // XMM15
343     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
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,
365     lldb_sil_x86_64,   // SIL
366     lldb_dil_x86_64,   // DIL
367     lldb_bpl_x86_64,   // BPL
368     lldb_spl_x86_64,   // SPL
369     lldb_rax_x86_64,   // RAX
370     lldb_rbx_x86_64,   // RBX
371     lldb_rcx_x86_64,   // RCX
372     lldb_rdx_x86_64,   // RDX
373     lldb_rsi_x86_64,   // RSI
374     lldb_rdi_x86_64,   // RDI
375     lldb_rbp_x86_64,   // RBP
376     lldb_rsp_x86_64,   // RSP
377     lldb_r8_x86_64,    // R8
378     lldb_r9_x86_64,    // R9
379     lldb_r10_x86_64,   // R10
380     lldb_r11_x86_64,   // R11
381     lldb_r12_x86_64,   // R12
382     lldb_r13_x86_64,   // R13
383     lldb_r14_x86_64,   // R14
384     lldb_r15_x86_64,   // R15
385     lldb_r8l_x86_64,   // R8B
386     lldb_r9l_x86_64,   // R9B
387     lldb_r10l_x86_64,  // R10B
388     lldb_r11l_x86_64,  // R11B
389     lldb_r12l_x86_64,  // R12B
390     lldb_r13l_x86_64,  // R13B
391     lldb_r14l_x86_64,  // R14B
392     lldb_r15l_x86_64,  // R15B
393     lldb_r8w_x86_64,   // R8W
394     lldb_r9w_x86_64,   // R9W
395     lldb_r10w_x86_64,  // R10W
396     lldb_r11w_x86_64,  // R11W
397     lldb_r12w_x86_64,  // R12W
398     lldb_r13w_x86_64,  // R13W
399     lldb_r14w_x86_64,  // R14W
400     lldb_r15w_x86_64,  // R15W
401     lldb_r8d_x86_64,   // R8D
402     lldb_r9d_x86_64,   // R9D
403     lldb_r10d_x86_64,  // R10D
404     lldb_r11d_x86_64,  // R11D
405     lldb_r12d_x86_64,  // R12D
406     lldb_r13d_x86_64,  // R13D
407     lldb_r14d_x86_64,  // R14D
408     lldb_r15d_x86_64,  // R15D
409     lldb_ymm0_x86_64,  // AMD64_YMM0
410     lldb_ymm1_x86_64,  // AMD64_YMM1
411     lldb_ymm2_x86_64,  // AMD64_YMM2
412     lldb_ymm3_x86_64,  // AMD64_YMM3
413     lldb_ymm4_x86_64,  // AMD64_YMM4
414     lldb_ymm5_x86_64,  // AMD64_YMM5
415     lldb_ymm6_x86_64,  // AMD64_YMM6
416     lldb_ymm7_x86_64,  // AMD64_YMM7
417     lldb_ymm8_x86_64,  // AMD64_YMM8
418     lldb_ymm9_x86_64,  // AMD64_YMM9
419     lldb_ymm10_x86_64, // AMD64_YMM10
420     lldb_ymm11_x86_64, // AMD64_YMM11
421     lldb_ymm12_x86_64, // AMD64_YMM12
422     lldb_ymm13_x86_64, // AMD64_YMM13
423     lldb_ymm14_x86_64, // AMD64_YMM14
424     lldb_ymm15_x86_64, // AMD64_YMM15
425     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
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_bnd0_x86_64, // BND0
430     lldb_bnd1_x86_64, // BND1
431     lldb_bnd2_x86_64  // BND2
432 };
433 
434 uint32_t GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type,
435                                llvm::codeview::RegisterId register_id) {
436   switch (arch_type) {
437   case llvm::Triple::x86:
438     if (static_cast<uint16_t>(register_id) <
439         sizeof(g_code_view_to_lldb_registers_x86) /
440             sizeof(g_code_view_to_lldb_registers_x86[0]))
441       return g_code_view_to_lldb_registers_x86[static_cast<uint16_t>(
442           register_id)];
443 
444     switch (register_id) {
445     case llvm::codeview::RegisterId::MXCSR:
446       return lldb_mxcsr_i386;
447     case llvm::codeview::RegisterId::BND0:
448       return lldb_bnd0_i386;
449     case llvm::codeview::RegisterId::BND1:
450       return lldb_bnd1_i386;
451     case llvm::codeview::RegisterId::BND2:
452       return lldb_bnd2_i386;
453     default:
454       return LLDB_INVALID_REGNUM;
455     }
456   case llvm::Triple::x86_64:
457     if (static_cast<uint16_t>(register_id) <
458         sizeof(g_code_view_to_lldb_registers_x86_64) /
459             sizeof(g_code_view_to_lldb_registers_x86_64[0]))
460       return g_code_view_to_lldb_registers_x86_64[static_cast<uint16_t>(
461           register_id)];
462 
463     return LLDB_INVALID_REGNUM;
464   default:
465     return LLDB_INVALID_REGNUM;
466   }
467 }
468 
469 uint32_t GetGenericRegisterNumber(llvm::codeview::RegisterId register_id) {
470   if (register_id == llvm::codeview::RegisterId::VFRAME)
471     return LLDB_REGNUM_GENERIC_FP;
472 
473   return LLDB_INVALID_REGNUM;
474 }
475 
476 uint32_t GetRegisterNumber(llvm::Triple::ArchType arch_type,
477                            llvm::codeview::RegisterId register_id,
478                            RegisterKind &register_kind) {
479   register_kind = eRegisterKindLLDB;
480   uint32_t reg_num = GetLLDBRegisterNumber(arch_type, register_id);
481   if (reg_num != LLDB_INVALID_REGNUM)
482     return reg_num;
483 
484   register_kind = eRegisterKindGeneric;
485   return GetGenericRegisterNumber(register_id);
486 }
487 } // namespace
488 
489 DWARFExpression ConvertPDBLocationToDWARFExpression(ModuleSP module,
490                                                     const PDBSymbolData &symbol,
491                                                     bool &is_constant) {
492   is_constant = true;
493 
494   if (!module)
495     return DWARFExpression(nullptr);
496 
497   const ArchSpec &architecture = module->GetArchitecture();
498   llvm::Triple::ArchType arch_type = architecture.GetMachine();
499   ByteOrder byte_order = architecture.GetByteOrder();
500   uint32_t address_size = architecture.GetAddressByteSize();
501   uint32_t byte_size = architecture.GetDataByteSize();
502   if (byte_order == eByteOrderInvalid || address_size == 0)
503     return DWARFExpression(nullptr);
504 
505   RegisterKind register_kind = eRegisterKindDWARF;
506   StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order);
507   switch (symbol.getLocationType()) {
508   case PDB_LocType::Static:
509   case PDB_LocType::TLS: {
510     stream.PutHex8(DW_OP_addr);
511 
512     SectionList *section_list = module->GetSectionList();
513     if (!section_list)
514       return DWARFExpression(nullptr);
515 
516     uint32_t section_idx = symbol.getAddressSection() - 1;
517     if (section_idx >= section_list->GetSize())
518       return DWARFExpression(nullptr);
519 
520     auto section = section_list->GetSectionAtIndex(section_idx);
521     if (!section)
522       return DWARFExpression(nullptr);
523 
524     uint32_t offset = symbol.getAddressOffset();
525     stream.PutMaxHex64(section->GetFileAddress() + offset, address_size,
526                        byte_order);
527 
528     is_constant = false;
529 
530     break;
531   }
532   case PDB_LocType::RegRel: {
533     uint32_t reg_num =
534         GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind);
535     if (reg_num == LLDB_INVALID_REGNUM)
536       return DWARFExpression(nullptr);
537 
538     if (reg_num > 31) {
539       stream.PutHex8(DW_OP_bregx);
540       stream.PutULEB128(reg_num);
541     } else
542       stream.PutHex8(DW_OP_breg0 + reg_num);
543 
544     int32_t offset = symbol.getOffset();
545     stream.PutSLEB128(offset);
546 
547     is_constant = false;
548 
549     break;
550   }
551   case PDB_LocType::Enregistered: {
552     uint32_t reg_num =
553         GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind);
554     if (reg_num == LLDB_INVALID_REGNUM)
555       return DWARFExpression(nullptr);
556 
557     if (reg_num > 31) {
558       stream.PutHex8(DW_OP_regx);
559       stream.PutULEB128(reg_num);
560     } else
561       stream.PutHex8(DW_OP_reg0 + reg_num);
562 
563     is_constant = false;
564 
565     break;
566   }
567   case PDB_LocType::Constant: {
568     Variant value = symbol.getValue();
569     stream.PutRawBytes(&value.Value, sizeof(value.Value),
570                        endian::InlHostByteOrder());
571     break;
572   }
573   default:
574     return DWARFExpression(nullptr);
575   }
576 
577   DataBufferSP buffer =
578       std::make_shared<DataBufferHeap>(stream.GetData(), stream.GetSize());
579   DataExtractor extractor(buffer, byte_order, address_size, byte_size);
580   DWARFExpression result(module, extractor, nullptr, 0, buffer->GetByteSize());
581   result.SetRegisterKind(register_kind);
582 
583   return result;
584 }
585