]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/SymbolFile/PDB/PDBLocationToDWARFExpression.cpp
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / SymbolFile / PDB / PDBLocationToDWARFExpression.cpp
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, // NONE
30     lldb_al_i386,        // AL
31     lldb_cl_i386,        // CL
32     lldb_dl_i386,        // DL
33     lldb_bl_i386,        // BL
34     lldb_ah_i386,        // AH
35     lldb_ch_i386,        // CH
36     lldb_dh_i386,        // DH
37     lldb_bh_i386,        // BH
38     lldb_ax_i386,        // AX
39     lldb_cx_i386,        // CX
40     lldb_dx_i386,        // DX
41     lldb_bx_i386,        // BX
42     lldb_sp_i386,        // SP
43     lldb_bp_i386,        // BP
44     lldb_si_i386,        // SI
45     lldb_di_i386,        // DI
46     lldb_eax_i386,       // EAX
47     lldb_ecx_i386,       // ECX
48     lldb_edx_i386,       // EDX
49     lldb_ebx_i386,       // EBX
50     lldb_esp_i386,       // ESP
51     lldb_ebp_i386,       // EBP
52     lldb_esi_i386,       // ESI
53     lldb_edi_i386,       // EDI
54     lldb_es_i386,        // ES
55     lldb_cs_i386,        // CS
56     lldb_ss_i386,        // SS
57     lldb_ds_i386,        // DS
58     lldb_fs_i386,        // FS
59     lldb_gs_i386,        // GS
60     LLDB_INVALID_REGNUM, // IP
61     LLDB_INVALID_REGNUM, // FLAGS
62     lldb_eip_i386,       // EIP
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,
92     lldb_dr0_i386, // DR0
93     lldb_dr1_i386, // DR1
94     lldb_dr2_i386, // DR2
95     lldb_dr3_i386, // DR3
96     lldb_dr4_i386, // DR4
97     lldb_dr5_i386, // DR5
98     lldb_dr6_i386, // DR6
99     lldb_dr7_i386, // DR7
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
154 };
155
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,
298     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,
303     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,
365     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
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::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;
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::VFRAME)
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 }