1 //===-- PDBLocationToDWARFExpression.cpp ------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "PDBLocationToDWARFExpression.h"
11 
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"
17 
18 #include "llvm/DebugInfo/CodeView/CodeView.h"
19 #include "llvm/DebugInfo/PDB/PDBSymbolData.h"
20 
21 #include "Plugins/Process/Utility/lldb-x86-register-enums.h"
22 
23 using namespace lldb;
24 using namespace lldb_private;
25 using namespace llvm::pdb;
26 
27 namespace {
28 const uint32_t g_code_view_to_lldb_registers_x86[] = {
29     LLDB_INVALID_REGNUM, // CVRegNONE
30     lldb_al_i386,        // CVRegAL
31     lldb_cl_i386,        // CVRegCL
32     lldb_dl_i386,        // CVRegDL
33     lldb_bl_i386,        // CVRegBL
34     lldb_ah_i386,        // CVRegAH
35     lldb_ch_i386,        // CVRegCH
36     lldb_dh_i386,        // CVRegDH
37     lldb_bh_i386,        // CVRegBH
38     lldb_ax_i386,        // CVRegAX
39     lldb_cx_i386,        // CVRegCX
40     lldb_dx_i386,        // CVRegDX
41     lldb_bx_i386,        // CVRegBX
42     lldb_sp_i386,        // CVRegSP
43     lldb_bp_i386,        // CVRegBP
44     lldb_si_i386,        // CVRegSI
45     lldb_di_i386,        // CVRegDI
46     lldb_eax_i386,       // CVRegEAX
47     lldb_ecx_i386,       // CVRegECX
48     lldb_edx_i386,       // CVRegEDX
49     lldb_ebx_i386,       // CVRegEBX
50     lldb_esp_i386,       // CVRegESP
51     lldb_ebp_i386,       // CVRegEBP
52     lldb_esi_i386,       // CVRegESI
53     lldb_edi_i386,       // CVRegEDI
54     lldb_es_i386,        // CVRegES
55     lldb_cs_i386,        // CVRegCS
56     lldb_ss_i386,        // CVRegSS
57     lldb_ds_i386,        // CVRegDS
58     lldb_fs_i386,        // CVRegFS
59     lldb_gs_i386,        // CVRegGS
60     LLDB_INVALID_REGNUM, // CVRegIP
61     LLDB_INVALID_REGNUM, // CVRegFLAGS
62     lldb_eip_i386,       // CVRegEIP
63     lldb_eflags_i386,    // CVRegEFLAGS
64     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
65     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
66     LLDB_INVALID_REGNUM, // CVRegTEMP
67     LLDB_INVALID_REGNUM, // CVRegTEMPH
68     LLDB_INVALID_REGNUM, // CVRegQUOTE
69     LLDB_INVALID_REGNUM, // CVRegPCDR3
70     LLDB_INVALID_REGNUM, // CVRegPCDR4
71     LLDB_INVALID_REGNUM, // CVRegPCDR5
72     LLDB_INVALID_REGNUM, // CVRegPCDR6
73     LLDB_INVALID_REGNUM, // CVRegPCDR7
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, // CVRegCR0
86     LLDB_INVALID_REGNUM, // CVRegCR1
87     LLDB_INVALID_REGNUM, // CVRegCR2
88     LLDB_INVALID_REGNUM, // CVRegCR3
89     LLDB_INVALID_REGNUM, // CVRegCR4
90     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
91     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
92     lldb_dr0_i386, // CVRegDR0
93     lldb_dr1_i386, // CVRegDR1
94     lldb_dr2_i386, // CVRegDR2
95     lldb_dr3_i386, // CVRegDR3
96     lldb_dr4_i386, // CVRegDR4
97     lldb_dr5_i386, // CVRegDR5
98     lldb_dr6_i386, // CVRegDR6
99     lldb_dr7_i386, // CVRegDR7
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, // CVRegGDTR
105     LLDB_INVALID_REGNUM, // CVRegGDTL
106     LLDB_INVALID_REGNUM, // CVRegIDTR
107     LLDB_INVALID_REGNUM, // CVRegIDTL
108     LLDB_INVALID_REGNUM, // CVRegLDTR
109     LLDB_INVALID_REGNUM, // CVRegTR
110     LLDB_INVALID_REGNUM, // CVRegPSEUDO1
111     LLDB_INVALID_REGNUM, // CVRegPSEUDO2
112     LLDB_INVALID_REGNUM, // CVRegPSEUDO3
113     LLDB_INVALID_REGNUM, // CVRegPSEUDO4
114     LLDB_INVALID_REGNUM, // CVRegPSEUDO5
115     LLDB_INVALID_REGNUM, // CVRegPSEUDO6
116     LLDB_INVALID_REGNUM, // CVRegPSEUDO7
117     LLDB_INVALID_REGNUM, // CVRegPSEUDO8
118     LLDB_INVALID_REGNUM, // CVRegPSEUDO9
119     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
120     lldb_st0_i386,       // CVRegST0
121     lldb_st1_i386,       // CVRegST1
122     lldb_st2_i386,       // CVRegST2
123     lldb_st3_i386,       // CVRegST3
124     lldb_st4_i386,       // CVRegST4
125     lldb_st5_i386,       // CVRegST5
126     lldb_st6_i386,       // CVRegST6
127     lldb_st7_i386,       // CVRegST7
128     LLDB_INVALID_REGNUM, // CVRegCTRL
129     LLDB_INVALID_REGNUM, // CVRegSTAT
130     LLDB_INVALID_REGNUM, // CVRegTAG
131     LLDB_INVALID_REGNUM, // CVRegFPIP
132     LLDB_INVALID_REGNUM, // CVRegFPCS
133     LLDB_INVALID_REGNUM, // CVRegFPDO
134     LLDB_INVALID_REGNUM, // CVRegFPDS
135     LLDB_INVALID_REGNUM, // CVRegISEM
136     LLDB_INVALID_REGNUM, // CVRegFPEIP
137     LLDB_INVALID_REGNUM, // CVRegFPEDO
138     lldb_mm0_i386,       // CVRegMM0
139     lldb_mm1_i386,       // CVRegMM1
140     lldb_mm2_i386,       // CVRegMM2
141     lldb_mm3_i386,       // CVRegMM3
142     lldb_mm4_i386,       // CVRegMM4
143     lldb_mm5_i386,       // CVRegMM5
144     lldb_mm6_i386,       // CVRegMM6
145     lldb_mm7_i386,       // CVRegMM7
146     lldb_xmm0_i386,      // CVRegXMM0
147     lldb_xmm1_i386,      // CVRegXMM1
148     lldb_xmm2_i386,      // CVRegXMM2
149     lldb_xmm3_i386,      // CVRegXMM3
150     lldb_xmm4_i386,      // CVRegXMM4
151     lldb_xmm5_i386,      // CVRegXMM5
152     lldb_xmm6_i386,      // CVRegXMM6
153     lldb_xmm7_i386       // CVRegXMM7
154 };
155 
156 const uint32_t g_code_view_to_lldb_registers_x86_64[] = {
157     LLDB_INVALID_REGNUM, // CVRegNONE
158     lldb_al_x86_64,      // CVRegAL
159     lldb_cl_x86_64,      // CVRegCL
160     lldb_dl_x86_64,      // CVRegDL
161     lldb_bl_x86_64,      // CVRegBL
162     lldb_ah_x86_64,      // CVRegAH
163     lldb_ch_x86_64,      // CVRegCH
164     lldb_dh_x86_64,      // CVRegDH
165     lldb_bh_x86_64,      // CVRegBH
166     lldb_ax_x86_64,      // CVRegAX
167     lldb_cx_x86_64,      // CVRegCX
168     lldb_dx_x86_64,      // CVRegDX
169     lldb_bx_x86_64,      // CVRegBX
170     lldb_sp_x86_64,      // CVRegSP
171     lldb_bp_x86_64,      // CVRegBP
172     lldb_si_x86_64,      // CVRegSI
173     lldb_di_x86_64,      // CVRegDI
174     lldb_eax_x86_64,     // CVRegEAX
175     lldb_ecx_x86_64,     // CVRegECX
176     lldb_edx_x86_64,     // CVRegEDX
177     lldb_ebx_x86_64,     // CVRegEBX
178     lldb_esp_x86_64,     // CVRegESP
179     lldb_ebp_x86_64,     // CVRegEBP
180     lldb_esi_x86_64,     // CVRegESI
181     lldb_edi_x86_64,     // CVRegEDI
182     lldb_es_x86_64,      // CVRegES
183     lldb_cs_x86_64,      // CVRegCS
184     lldb_ss_x86_64,      // CVRegSS
185     lldb_ds_x86_64,      // CVRegDS
186     lldb_fs_x86_64,      // CVRegFS
187     lldb_gs_x86_64,      // CVRegGS
188     LLDB_INVALID_REGNUM, // CVRegIP
189     LLDB_INVALID_REGNUM, // CVRegFLAGS
190     LLDB_INVALID_REGNUM, // CVRegEIP
191     LLDB_INVALID_REGNUM, // CVRegEFLAGS
192     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
193     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
194     LLDB_INVALID_REGNUM, // CVRegTEMP
195     LLDB_INVALID_REGNUM, // CVRegTEMPH
196     LLDB_INVALID_REGNUM, // CVRegQUOTE
197     LLDB_INVALID_REGNUM, // CVRegPCDR3
198     LLDB_INVALID_REGNUM, // CVRegPCDR4
199     LLDB_INVALID_REGNUM, // CVRegPCDR5
200     LLDB_INVALID_REGNUM, // CVRegPCDR6
201     LLDB_INVALID_REGNUM, // CVRegPCDR7
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, // CVRegCR0
214     LLDB_INVALID_REGNUM, // CVRegCR1
215     LLDB_INVALID_REGNUM, // CVRegCR2
216     LLDB_INVALID_REGNUM, // CVRegCR3
217     LLDB_INVALID_REGNUM, // CVRegCR4
218     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
219     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
220     lldb_dr0_x86_64, // CVRegDR0
221     lldb_dr1_x86_64, // CVRegDR1
222     lldb_dr2_x86_64, // CVRegDR2
223     lldb_dr3_x86_64, // CVRegDR3
224     lldb_dr4_x86_64, // CVRegDR4
225     lldb_dr5_x86_64, // CVRegDR5
226     lldb_dr6_x86_64, // CVRegDR6
227     lldb_dr7_x86_64, // CVRegDR7
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, // CVRegGDTR
233     LLDB_INVALID_REGNUM, // CVRegGDTL
234     LLDB_INVALID_REGNUM, // CVRegIDTR
235     LLDB_INVALID_REGNUM, // CVRegIDTL
236     LLDB_INVALID_REGNUM, // CVRegLDTR
237     LLDB_INVALID_REGNUM, // CVRegTR
238     LLDB_INVALID_REGNUM, // CVRegPSEUDO1
239     LLDB_INVALID_REGNUM, // CVRegPSEUDO2
240     LLDB_INVALID_REGNUM, // CVRegPSEUDO3
241     LLDB_INVALID_REGNUM, // CVRegPSEUDO4
242     LLDB_INVALID_REGNUM, // CVRegPSEUDO5
243     LLDB_INVALID_REGNUM, // CVRegPSEUDO6
244     LLDB_INVALID_REGNUM, // CVRegPSEUDO7
245     LLDB_INVALID_REGNUM, // CVRegPSEUDO8
246     LLDB_INVALID_REGNUM, // CVRegPSEUDO9
247     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
248     lldb_st0_x86_64,     // CVRegST0
249     lldb_st1_x86_64,     // CVRegST1
250     lldb_st2_x86_64,     // CVRegST2
251     lldb_st3_x86_64,     // CVRegST3
252     lldb_st4_x86_64,     // CVRegST4
253     lldb_st5_x86_64,     // CVRegST5
254     lldb_st6_x86_64,     // CVRegST6
255     lldb_st7_x86_64,     // CVRegST7
256     LLDB_INVALID_REGNUM, // CVRegCTRL
257     LLDB_INVALID_REGNUM, // CVRegSTAT
258     LLDB_INVALID_REGNUM, // CVRegTAG
259     LLDB_INVALID_REGNUM, // CVRegFPIP
260     LLDB_INVALID_REGNUM, // CVRegFPCS
261     LLDB_INVALID_REGNUM, // CVRegFPDO
262     LLDB_INVALID_REGNUM, // CVRegFPDS
263     LLDB_INVALID_REGNUM, // CVRegISEM
264     LLDB_INVALID_REGNUM, // CVRegFPEIP
265     LLDB_INVALID_REGNUM, // CVRegFPEDO
266     lldb_mm0_x86_64,     // CVRegMM0
267     lldb_mm1_x86_64,     // CVRegMM1
268     lldb_mm2_x86_64,     // CVRegMM2
269     lldb_mm3_x86_64,     // CVRegMM3
270     lldb_mm4_x86_64,     // CVRegMM4
271     lldb_mm5_x86_64,     // CVRegMM5
272     lldb_mm6_x86_64,     // CVRegMM6
273     lldb_mm7_x86_64,     // CVRegMM7
274     lldb_xmm0_x86_64,    // CVRegXMM0
275     lldb_xmm1_x86_64,    // CVRegXMM1
276     lldb_xmm2_x86_64,    // CVRegXMM2
277     lldb_xmm3_x86_64,    // CVRegXMM3
278     lldb_xmm4_x86_64,    // CVRegXMM4
279     lldb_xmm5_x86_64,    // CVRegXMM5
280     lldb_xmm6_x86_64,    // CVRegXMM6
281     lldb_xmm7_x86_64,    // CVRegXMM7
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,
298     LLDB_INVALID_REGNUM,
299     lldb_mxcsr_x86_64,   // CVRegMXCSR
300     LLDB_INVALID_REGNUM, // CVRegEDXEAX
301     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
302     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
303     LLDB_INVALID_REGNUM,
304     LLDB_INVALID_REGNUM, // CVRegEMM0L
305     LLDB_INVALID_REGNUM, // CVRegEMM1L
306     LLDB_INVALID_REGNUM, // CVRegEMM2L
307     LLDB_INVALID_REGNUM, // CVRegEMM3L
308     LLDB_INVALID_REGNUM, // CVRegEMM4L
309     LLDB_INVALID_REGNUM, // CVRegEMM5L
310     LLDB_INVALID_REGNUM, // CVRegEMM6L
311     LLDB_INVALID_REGNUM, // CVRegEMM7L
312     LLDB_INVALID_REGNUM, // CVRegEMM0H
313     LLDB_INVALID_REGNUM, // CVRegEMM1H
314     LLDB_INVALID_REGNUM, // CVRegEMM2H
315     LLDB_INVALID_REGNUM, // CVRegEMM3H
316     LLDB_INVALID_REGNUM, // CVRegEMM4H
317     LLDB_INVALID_REGNUM, // CVRegEMM5H
318     LLDB_INVALID_REGNUM, // CVRegEMM6H
319     LLDB_INVALID_REGNUM, // CVRegEMM7H
320     LLDB_INVALID_REGNUM, // CVRegMM00
321     LLDB_INVALID_REGNUM, // CVRegMM01
322     LLDB_INVALID_REGNUM, // CVRegMM10
323     LLDB_INVALID_REGNUM, // CVRegMM11
324     LLDB_INVALID_REGNUM, // CVRegMM20
325     LLDB_INVALID_REGNUM, // CVRegMM21
326     LLDB_INVALID_REGNUM, // CVRegMM30
327     LLDB_INVALID_REGNUM, // CVRegMM31
328     LLDB_INVALID_REGNUM, // CVRegMM40
329     LLDB_INVALID_REGNUM, // CVRegMM41
330     LLDB_INVALID_REGNUM, // CVRegMM50
331     LLDB_INVALID_REGNUM, // CVRegMM51
332     LLDB_INVALID_REGNUM, // CVRegMM60
333     LLDB_INVALID_REGNUM, // CVRegMM61
334     LLDB_INVALID_REGNUM, // CVRegMM70
335     LLDB_INVALID_REGNUM, // CVRegMM71
336     lldb_xmm8_x86_64,    // CVRegXMM8
337     lldb_xmm9_x86_64,    // CVRegXMM9
338     lldb_xmm10_x86_64,   // CVRegXMM10
339     lldb_xmm11_x86_64,   // CVRegXMM11
340     lldb_xmm12_x86_64,   // CVRegXMM12
341     lldb_xmm13_x86_64,   // CVRegXMM13
342     lldb_xmm14_x86_64,   // CVRegXMM14
343     lldb_xmm15_x86_64,   // CVRegXMM15
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,
365     LLDB_INVALID_REGNUM,
366     lldb_sil_x86_64,   // CVRegSIL
367     lldb_dil_x86_64,   // CVRegDIL
368     lldb_bpl_x86_64,   // CVRegBPL
369     lldb_spl_x86_64,   // CVRegSPL
370     lldb_rax_x86_64,   // CVRegRAX
371     lldb_rbx_x86_64,   // CVRegRBX
372     lldb_rcx_x86_64,   // CVRegRCX
373     lldb_rdx_x86_64,   // CVRegRDX
374     lldb_rsi_x86_64,   // CVRegRSI
375     lldb_rdi_x86_64,   // CVRegRDI
376     lldb_rbp_x86_64,   // CVRegRBP
377     lldb_rsp_x86_64,   // CVRegRSP
378     lldb_r8_x86_64,    // CVRegR8
379     lldb_r9_x86_64,    // CVRegR9
380     lldb_r10_x86_64,   // CVRegR10
381     lldb_r11_x86_64,   // CVRegR11
382     lldb_r12_x86_64,   // CVRegR12
383     lldb_r13_x86_64,   // CVRegR13
384     lldb_r14_x86_64,   // CVRegR14
385     lldb_r15_x86_64,   // CVRegR15
386     lldb_r8l_x86_64,   // CVRegR8B
387     lldb_r9l_x86_64,   // CVRegR9B
388     lldb_r10l_x86_64,  // CVRegR10B
389     lldb_r11l_x86_64,  // CVRegR11B
390     lldb_r12l_x86_64,  // CVRegR12B
391     lldb_r13l_x86_64,  // CVRegR13B
392     lldb_r14l_x86_64,  // CVRegR14B
393     lldb_r15l_x86_64,  // CVRegR15B
394     lldb_r8w_x86_64,   // CVRegR8W
395     lldb_r9w_x86_64,   // CVRegR9W
396     lldb_r10w_x86_64,  // CVRegR10W
397     lldb_r11w_x86_64,  // CVRegR11W
398     lldb_r12w_x86_64,  // CVRegR12W
399     lldb_r13w_x86_64,  // CVRegR13W
400     lldb_r14w_x86_64,  // CVRegR14W
401     lldb_r15w_x86_64,  // CVRegR15W
402     lldb_r8d_x86_64,   // CVRegR8D
403     lldb_r9d_x86_64,   // CVRegR9D
404     lldb_r10d_x86_64,  // CVRegR10D
405     lldb_r11d_x86_64,  // CVRegR11D
406     lldb_r12d_x86_64,  // CVRegR12D
407     lldb_r13d_x86_64,  // CVRegR13D
408     lldb_r14d_x86_64,  // CVRegR14D
409     lldb_r15d_x86_64,  // CVRegR15D
410     lldb_ymm0_x86_64,  // CVRegAMD64_YMM0
411     lldb_ymm1_x86_64,  // CVRegAMD64_YMM1
412     lldb_ymm2_x86_64,  // CVRegAMD64_YMM2
413     lldb_ymm3_x86_64,  // CVRegAMD64_YMM3
414     lldb_ymm4_x86_64,  // CVRegAMD64_YMM4
415     lldb_ymm5_x86_64,  // CVRegAMD64_YMM5
416     lldb_ymm6_x86_64,  // CVRegAMD64_YMM6
417     lldb_ymm7_x86_64,  // CVRegAMD64_YMM7
418     lldb_ymm8_x86_64,  // CVRegAMD64_YMM8
419     lldb_ymm9_x86_64,  // CVRegAMD64_YMM9
420     lldb_ymm10_x86_64, // CVRegAMD64_YMM10
421     lldb_ymm11_x86_64, // CVRegAMD64_YMM11
422     lldb_ymm12_x86_64, // CVRegAMD64_YMM12
423     lldb_ymm13_x86_64, // CVRegAMD64_YMM13
424     lldb_ymm14_x86_64, // CVRegAMD64_YMM14
425     lldb_ymm15_x86_64, // CVRegAMD64_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, // CVRegBND0
431     lldb_bnd1_x86_64, // CVRegBND1
432     lldb_bnd2_x86_64  // CVRegBND2
433 };
434 
435 uint32_t GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type,
436                                llvm::codeview::RegisterId register_id) {
437   switch (arch_type) {
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>(
443           register_id)];
444 
445     switch (register_id) {
446     case llvm::codeview::RegisterId::CVRegMXCSR:
447       return lldb_mxcsr_i386;
448     case llvm::codeview::RegisterId::CVRegBND0:
449       return lldb_bnd0_i386;
450     case llvm::codeview::RegisterId::CVRegBND1:
451       return lldb_bnd1_i386;
452     case llvm::codeview::RegisterId::CVRegBND2:
453       return lldb_bnd2_i386;
454     default:
455       return LLDB_INVALID_REGNUM;
456     }
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>(
462           register_id)];
463 
464     return LLDB_INVALID_REGNUM;
465   default:
466     return LLDB_INVALID_REGNUM;
467   }
468 }
469 
470 uint32_t GetGenericRegisterNumber(llvm::codeview::RegisterId register_id) {
471   if (register_id == llvm::codeview::RegisterId::CVRegVFRAME)
472     return LLDB_REGNUM_GENERIC_FP;
473 
474   return LLDB_INVALID_REGNUM;
475 }
476 
477 uint32_t GetRegisterNumber(llvm::Triple::ArchType arch_type,
478                            llvm::codeview::RegisterId register_id,
479                            RegisterKind &register_kind) {
480   register_kind = eRegisterKindLLDB;
481   uint32_t reg_num = GetLLDBRegisterNumber(arch_type, register_id);
482   if (reg_num != LLDB_INVALID_REGNUM)
483     return reg_num;
484 
485   register_kind = eRegisterKindGeneric;
486   return GetGenericRegisterNumber(register_id);
487 }
488 } // namespace
489 
490 DWARFExpression ConvertPDBLocationToDWARFExpression(ModuleSP module,
491                                                     const PDBSymbolData &symbol,
492                                                     bool &is_constant) {
493   is_constant = true;
494 
495   if (!module)
496     return DWARFExpression(nullptr);
497 
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);
505 
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);
512 
513     SectionList *section_list = module->GetSectionList();
514     if (!section_list)
515       return DWARFExpression(nullptr);
516 
517     uint32_t section_idx = symbol.getAddressSection() - 1;
518     if (section_idx >= section_list->GetSize())
519       return DWARFExpression(nullptr);
520 
521     auto section = section_list->GetSectionAtIndex(section_idx);
522     if (!section)
523       return DWARFExpression(nullptr);
524 
525     uint32_t offset = symbol.getAddressOffset();
526     stream.PutMaxHex64(section->GetFileAddress() + offset, address_size,
527                        byte_order);
528 
529     is_constant = false;
530 
531     break;
532   }
533   case PDB_LocType::RegRel: {
534     uint32_t reg_num =
535         GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind);
536     if (reg_num == LLDB_INVALID_REGNUM)
537       return DWARFExpression(nullptr);
538 
539     if (reg_num > 31) {
540       stream.PutHex8(DW_OP_bregx);
541       stream.PutULEB128(reg_num);
542     } else
543       stream.PutHex8(DW_OP_breg0 + reg_num);
544 
545     int32_t offset = symbol.getOffset();
546     stream.PutSLEB128(offset);
547 
548     is_constant = false;
549 
550     break;
551   }
552   case PDB_LocType::Enregistered: {
553     uint32_t reg_num =
554         GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind);
555     if (reg_num == LLDB_INVALID_REGNUM)
556       return DWARFExpression(nullptr);
557 
558     if (reg_num > 31) {
559       stream.PutHex8(DW_OP_regx);
560       stream.PutULEB128(reg_num);
561     } else
562       stream.PutHex8(DW_OP_reg0 + reg_num);
563 
564     is_constant = false;
565 
566     break;
567   }
568   case PDB_LocType::Constant: {
569     Variant value = symbol.getValue();
570     stream.PutRawBytes(&value.Value, sizeof(value.Value),
571                        endian::InlHostByteOrder());
572     break;
573   }
574   default:
575     return DWARFExpression(nullptr);
576   }
577 
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);
583 
584   return result;
585 }
586