]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - source/Plugins/SymbolFile/NativePDB/DWARFLocationExpression.cpp
Vendor import of lldb trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / source / Plugins / SymbolFile / NativePDB / DWARFLocationExpression.cpp
1 //===-- DWARFLocationExpression.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 "DWARFLocationExpression.h"
11
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"
19
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"
25
26 #include "PdbUtil.h"
27
28 using namespace lldb;
29 using namespace lldb_private;
30 using namespace lldb_private::npdb;
31 using namespace llvm::codeview;
32 using namespace llvm::pdb;
33
34 static const uint32_t g_code_view_to_lldb_registers_x86[] = {
35     LLDB_INVALID_REGNUM, // NONE
36     lldb_al_i386,        // AL
37     lldb_cl_i386,        // CL
38     lldb_dl_i386,        // DL
39     lldb_bl_i386,        // BL
40     lldb_ah_i386,        // AH
41     lldb_ch_i386,        // CH
42     lldb_dh_i386,        // DH
43     lldb_bh_i386,        // BH
44     lldb_ax_i386,        // AX
45     lldb_cx_i386,        // CX
46     lldb_dx_i386,        // DX
47     lldb_bx_i386,        // BX
48     lldb_sp_i386,        // SP
49     lldb_bp_i386,        // BP
50     lldb_si_i386,        // SI
51     lldb_di_i386,        // DI
52     lldb_eax_i386,       // EAX
53     lldb_ecx_i386,       // ECX
54     lldb_edx_i386,       // EDX
55     lldb_ebx_i386,       // EBX
56     lldb_esp_i386,       // ESP
57     lldb_ebp_i386,       // EBP
58     lldb_esi_i386,       // ESI
59     lldb_edi_i386,       // EDI
60     lldb_es_i386,        // ES
61     lldb_cs_i386,        // CS
62     lldb_ss_i386,        // SS
63     lldb_ds_i386,        // DS
64     lldb_fs_i386,        // FS
65     lldb_gs_i386,        // GS
66     LLDB_INVALID_REGNUM, // IP
67     LLDB_INVALID_REGNUM, // FLAGS
68     lldb_eip_i386,       // EIP
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,
98     lldb_dr0_i386, // DR0
99     lldb_dr1_i386, // DR1
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
160 };
161
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,
304     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,
309     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,
371     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
439 };
440
441 uint32_t GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type,
442                                llvm::codeview::RegisterId register_id) {
443   switch (arch_type) {
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>(
449           register_id)];
450
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;
460     default:
461       return LLDB_INVALID_REGNUM;
462     }
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>(
468           register_id)];
469
470     return LLDB_INVALID_REGNUM;
471   default:
472     return LLDB_INVALID_REGNUM;
473   }
474 }
475
476 uint32_t GetGenericRegisterNumber(llvm::codeview::RegisterId register_id) {
477   if (register_id == llvm::codeview::RegisterId::VFRAME)
478     return LLDB_REGNUM_GENERIC_FP;
479
480   return LLDB_INVALID_REGNUM;
481 }
482
483 static uint32_t GetRegisterNumber(llvm::Triple::ArchType arch_type,
484                                   llvm::codeview::RegisterId register_id,
485                                   RegisterKind &register_kind) {
486   register_kind = eRegisterKindLLDB;
487   uint32_t reg_num = GetLLDBRegisterNumber(arch_type, register_id);
488   if (reg_num != LLDB_INVALID_REGNUM)
489     return reg_num;
490
491   register_kind = eRegisterKindGeneric;
492   return GetGenericRegisterNumber(register_id);
493 }
494
495 static bool IsSimpleTypeSignedInteger(SimpleTypeKind kind) {
496   switch (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:
512     return true;
513   default:
514     return false;
515   }
516 }
517
518 static std::pair<size_t, bool> GetIntegralTypeInfo(TypeIndex ti,
519                                                    TpiStream &tpi) {
520   if (ti.isSimple()) {
521     SimpleTypeKind stk = ti.getSimpleKind();
522     return {GetTypeSizeForSimpleKind(stk), IsSimpleTypeSignedInteger(stk)};
523   }
524
525   CVType cvt = tpi.getType(ti);
526   switch (cvt.kind()) {
527   case LF_MODIFIER: {
528     ModifierRecord mfr;
529     llvm::cantFail(TypeDeserializer::deserializeAs<ModifierRecord>(cvt, mfr));
530     return GetIntegralTypeInfo(mfr.ModifiedType, tpi);
531   }
532   case LF_POINTER: {
533     PointerRecord pr;
534     llvm::cantFail(TypeDeserializer::deserializeAs<PointerRecord>(cvt, pr));
535     return GetIntegralTypeInfo(pr.ReferentType, tpi);
536   }
537   case LF_ENUM: {
538     EnumRecord er;
539     llvm::cantFail(TypeDeserializer::deserializeAs<EnumRecord>(cvt, er));
540     return GetIntegralTypeInfo(er.UnderlyingType, tpi);
541   }
542   default:
543     assert(false && "Type is not integral!");
544     return {0, false};
545   }
546 }
547
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);
557
558   RegisterKind register_kind = eRegisterKindDWARF;
559   StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order);
560
561   if (!writer(stream, register_kind))
562     return DWARFExpression(nullptr);
563
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);
569
570   return result;
571 }
572
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 &register_kind) -> bool {
578         uint32_t reg_num = GetRegisterNumber(
579             module->GetArchitecture().GetMachine(), reg, register_kind);
580         if (reg_num == LLDB_INVALID_REGNUM)
581           return false;
582
583         if (reg_num > 31) {
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);
589         } else {
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);
594         }
595
596         if (relative_offset)
597           stream.PutSLEB128(*relative_offset);
598
599         return true;
600       });
601 }
602
603 DWARFExpression lldb_private::npdb::MakeEnregisteredLocationExpression(
604     llvm::codeview::RegisterId reg, lldb::ModuleSP module) {
605   return MakeRegisterBasedLocationExpressionInternal(reg, llvm::None, module);
606 }
607
608 DWARFExpression lldb_private::npdb::MakeRegRelLocationExpression(
609     llvm::codeview::RegisterId reg, int32_t offset, lldb::ModuleSP module) {
610   return MakeRegisterBasedLocationExpressionInternal(reg, offset, module);
611 }
612
613 DWARFExpression lldb_private::npdb::MakeGlobalLocationExpression(
614     uint16_t section, uint32_t offset, ModuleSP module) {
615   assert(section > 0);
616   assert(module);
617
618   return MakeLocationExpressionInternal(
619       module, [&](Stream &stream, RegisterKind &register_kind) -> bool {
620         stream.PutHex8(llvm::dwarf::DW_OP_addr);
621
622         SectionList *section_list = module->GetSectionList();
623         assert(section_list);
624
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())
629           return false;
630
631         auto section_ptr = section_list->GetSectionAtIndex(section_idx);
632         if (!section_ptr)
633           return false;
634
635         stream.PutMaxHex64(section_ptr->GetFileAddress() + offset,
636                            stream.GetAddressByteSize(), stream.GetByteOrder());
637
638         return true;
639       });
640 }
641
642 DWARFExpression lldb_private::npdb::MakeConstantLocationExpression(
643     TypeIndex underlying_ti, TpiStream &tpi, const llvm::APSInt &constant,
644     ModuleSP module) {
645   const ArchSpec &architecture = module->GetArchitecture();
646   uint32_t address_size = architecture.GetAddressByteSize();
647
648   size_t size = 0;
649   bool is_signed = false;
650   std::tie(size, is_signed) = GetIntegralTypeInfo(underlying_ti, tpi);
651
652   union {
653     llvm::support::little64_t I;
654     llvm::support::ulittle64_t U;
655   } Value;
656
657   std::shared_ptr<DataBufferHeap> buffer = std::make_shared<DataBufferHeap>();
658   buffer->SetByteSize(size);
659
660   llvm::ArrayRef<uint8_t> bytes;
661   if (is_signed) {
662     Value.I = constant.getSExtValue();
663   } else {
664     Value.U = constant.getZExtValue();
665   }
666
667   bytes = llvm::makeArrayRef(reinterpret_cast<const uint8_t *>(&Value), 8)
668               .take_front(size);
669   buffer->CopyData(bytes.data(), size);
670   DataExtractor extractor(buffer, lldb::eByteOrderLittle, address_size);
671   DWARFExpression result(nullptr, extractor, nullptr, 0, size);
672   return result;
673 }