1*b5893f02SDimitry Andric //===-- DWARFLocationExpression.cpp -----------------------------*- C++ -*-===//
2*b5893f02SDimitry Andric //
3*b5893f02SDimitry Andric // The LLVM Compiler Infrastructure
4*b5893f02SDimitry Andric //
5*b5893f02SDimitry Andric // This file is distributed under the University of Illinois Open Source
6*b5893f02SDimitry Andric // License. See LICENSE.TXT for details.
7*b5893f02SDimitry Andric //
8*b5893f02SDimitry Andric //===----------------------------------------------------------------------===//
9*b5893f02SDimitry Andric
10*b5893f02SDimitry Andric #include "DWARFLocationExpression.h"
11*b5893f02SDimitry Andric
12*b5893f02SDimitry Andric #include "Plugins/Process/Utility/lldb-x86-register-enums.h"
13*b5893f02SDimitry Andric #include "lldb/Core/Module.h"
14*b5893f02SDimitry Andric #include "lldb/Core/Section.h"
15*b5893f02SDimitry Andric #include "lldb/Core/StreamBuffer.h"
16*b5893f02SDimitry Andric #include "lldb/Expression/DWARFExpression.h"
17*b5893f02SDimitry Andric #include "lldb/Utility/ArchSpec.h"
18*b5893f02SDimitry Andric #include "lldb/Utility/DataBufferHeap.h"
19*b5893f02SDimitry Andric
20*b5893f02SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h"
21*b5893f02SDimitry Andric #include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
22*b5893f02SDimitry Andric #include "llvm/DebugInfo/CodeView/TypeIndex.h"
23*b5893f02SDimitry Andric #include "llvm/DebugInfo/PDB/Native/TpiStream.h"
24*b5893f02SDimitry Andric #include "llvm/Support/Endian.h"
25*b5893f02SDimitry Andric
26*b5893f02SDimitry Andric #include "PdbUtil.h"
27*b5893f02SDimitry Andric
28*b5893f02SDimitry Andric using namespace lldb;
29*b5893f02SDimitry Andric using namespace lldb_private;
30*b5893f02SDimitry Andric using namespace lldb_private::npdb;
31*b5893f02SDimitry Andric using namespace llvm::codeview;
32*b5893f02SDimitry Andric using namespace llvm::pdb;
33*b5893f02SDimitry Andric
34*b5893f02SDimitry Andric static const uint32_t g_code_view_to_lldb_registers_x86[] = {
35*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // NONE
36*b5893f02SDimitry Andric lldb_al_i386, // AL
37*b5893f02SDimitry Andric lldb_cl_i386, // CL
38*b5893f02SDimitry Andric lldb_dl_i386, // DL
39*b5893f02SDimitry Andric lldb_bl_i386, // BL
40*b5893f02SDimitry Andric lldb_ah_i386, // AH
41*b5893f02SDimitry Andric lldb_ch_i386, // CH
42*b5893f02SDimitry Andric lldb_dh_i386, // DH
43*b5893f02SDimitry Andric lldb_bh_i386, // BH
44*b5893f02SDimitry Andric lldb_ax_i386, // AX
45*b5893f02SDimitry Andric lldb_cx_i386, // CX
46*b5893f02SDimitry Andric lldb_dx_i386, // DX
47*b5893f02SDimitry Andric lldb_bx_i386, // BX
48*b5893f02SDimitry Andric lldb_sp_i386, // SP
49*b5893f02SDimitry Andric lldb_bp_i386, // BP
50*b5893f02SDimitry Andric lldb_si_i386, // SI
51*b5893f02SDimitry Andric lldb_di_i386, // DI
52*b5893f02SDimitry Andric lldb_eax_i386, // EAX
53*b5893f02SDimitry Andric lldb_ecx_i386, // ECX
54*b5893f02SDimitry Andric lldb_edx_i386, // EDX
55*b5893f02SDimitry Andric lldb_ebx_i386, // EBX
56*b5893f02SDimitry Andric lldb_esp_i386, // ESP
57*b5893f02SDimitry Andric lldb_ebp_i386, // EBP
58*b5893f02SDimitry Andric lldb_esi_i386, // ESI
59*b5893f02SDimitry Andric lldb_edi_i386, // EDI
60*b5893f02SDimitry Andric lldb_es_i386, // ES
61*b5893f02SDimitry Andric lldb_cs_i386, // CS
62*b5893f02SDimitry Andric lldb_ss_i386, // SS
63*b5893f02SDimitry Andric lldb_ds_i386, // DS
64*b5893f02SDimitry Andric lldb_fs_i386, // FS
65*b5893f02SDimitry Andric lldb_gs_i386, // GS
66*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IP
67*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FLAGS
68*b5893f02SDimitry Andric lldb_eip_i386, // EIP
69*b5893f02SDimitry Andric lldb_eflags_i386, // EFLAGS
70*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
71*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
72*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TEMP
73*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TEMPH
74*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // QUOTE
75*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR3
76*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR4
77*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR5
78*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR6
79*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR7
80*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
81*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
82*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
83*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
84*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
85*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
86*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
87*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
88*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
89*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
90*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
91*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR0
92*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR1
93*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR2
94*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR3
95*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR4
96*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
97*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
98*b5893f02SDimitry Andric lldb_dr0_i386, // DR0
99*b5893f02SDimitry Andric lldb_dr1_i386, // DR1
100*b5893f02SDimitry Andric lldb_dr2_i386, // DR2
101*b5893f02SDimitry Andric lldb_dr3_i386, // DR3
102*b5893f02SDimitry Andric lldb_dr4_i386, // DR4
103*b5893f02SDimitry Andric lldb_dr5_i386, // DR5
104*b5893f02SDimitry Andric lldb_dr6_i386, // DR6
105*b5893f02SDimitry Andric lldb_dr7_i386, // DR7
106*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
107*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
108*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
109*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
110*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // GDTR
111*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // GDTL
112*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IDTR
113*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IDTL
114*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // LDTR
115*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TR
116*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO1
117*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO2
118*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO3
119*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO4
120*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO5
121*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO6
122*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO7
123*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO8
124*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO9
125*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
126*b5893f02SDimitry Andric lldb_st0_i386, // ST0
127*b5893f02SDimitry Andric lldb_st1_i386, // ST1
128*b5893f02SDimitry Andric lldb_st2_i386, // ST2
129*b5893f02SDimitry Andric lldb_st3_i386, // ST3
130*b5893f02SDimitry Andric lldb_st4_i386, // ST4
131*b5893f02SDimitry Andric lldb_st5_i386, // ST5
132*b5893f02SDimitry Andric lldb_st6_i386, // ST6
133*b5893f02SDimitry Andric lldb_st7_i386, // ST7
134*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CTRL
135*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // STAT
136*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TAG
137*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPIP
138*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPCS
139*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPDO
140*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPDS
141*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // ISEM
142*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPEIP
143*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPEDO
144*b5893f02SDimitry Andric lldb_mm0_i386, // MM0
145*b5893f02SDimitry Andric lldb_mm1_i386, // MM1
146*b5893f02SDimitry Andric lldb_mm2_i386, // MM2
147*b5893f02SDimitry Andric lldb_mm3_i386, // MM3
148*b5893f02SDimitry Andric lldb_mm4_i386, // MM4
149*b5893f02SDimitry Andric lldb_mm5_i386, // MM5
150*b5893f02SDimitry Andric lldb_mm6_i386, // MM6
151*b5893f02SDimitry Andric lldb_mm7_i386, // MM7
152*b5893f02SDimitry Andric lldb_xmm0_i386, // XMM0
153*b5893f02SDimitry Andric lldb_xmm1_i386, // XMM1
154*b5893f02SDimitry Andric lldb_xmm2_i386, // XMM2
155*b5893f02SDimitry Andric lldb_xmm3_i386, // XMM3
156*b5893f02SDimitry Andric lldb_xmm4_i386, // XMM4
157*b5893f02SDimitry Andric lldb_xmm5_i386, // XMM5
158*b5893f02SDimitry Andric lldb_xmm6_i386, // XMM6
159*b5893f02SDimitry Andric lldb_xmm7_i386 // XMM7
160*b5893f02SDimitry Andric };
161*b5893f02SDimitry Andric
162*b5893f02SDimitry Andric static const uint32_t g_code_view_to_lldb_registers_x86_64[] = {
163*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // NONE
164*b5893f02SDimitry Andric lldb_al_x86_64, // AL
165*b5893f02SDimitry Andric lldb_cl_x86_64, // CL
166*b5893f02SDimitry Andric lldb_dl_x86_64, // DL
167*b5893f02SDimitry Andric lldb_bl_x86_64, // BL
168*b5893f02SDimitry Andric lldb_ah_x86_64, // AH
169*b5893f02SDimitry Andric lldb_ch_x86_64, // CH
170*b5893f02SDimitry Andric lldb_dh_x86_64, // DH
171*b5893f02SDimitry Andric lldb_bh_x86_64, // BH
172*b5893f02SDimitry Andric lldb_ax_x86_64, // AX
173*b5893f02SDimitry Andric lldb_cx_x86_64, // CX
174*b5893f02SDimitry Andric lldb_dx_x86_64, // DX
175*b5893f02SDimitry Andric lldb_bx_x86_64, // BX
176*b5893f02SDimitry Andric lldb_sp_x86_64, // SP
177*b5893f02SDimitry Andric lldb_bp_x86_64, // BP
178*b5893f02SDimitry Andric lldb_si_x86_64, // SI
179*b5893f02SDimitry Andric lldb_di_x86_64, // DI
180*b5893f02SDimitry Andric lldb_eax_x86_64, // EAX
181*b5893f02SDimitry Andric lldb_ecx_x86_64, // ECX
182*b5893f02SDimitry Andric lldb_edx_x86_64, // EDX
183*b5893f02SDimitry Andric lldb_ebx_x86_64, // EBX
184*b5893f02SDimitry Andric lldb_esp_x86_64, // ESP
185*b5893f02SDimitry Andric lldb_ebp_x86_64, // EBP
186*b5893f02SDimitry Andric lldb_esi_x86_64, // ESI
187*b5893f02SDimitry Andric lldb_edi_x86_64, // EDI
188*b5893f02SDimitry Andric lldb_es_x86_64, // ES
189*b5893f02SDimitry Andric lldb_cs_x86_64, // CS
190*b5893f02SDimitry Andric lldb_ss_x86_64, // SS
191*b5893f02SDimitry Andric lldb_ds_x86_64, // DS
192*b5893f02SDimitry Andric lldb_fs_x86_64, // FS
193*b5893f02SDimitry Andric lldb_gs_x86_64, // GS
194*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IP
195*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FLAGS
196*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EIP
197*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EFLAGS
198*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
199*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
200*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TEMP
201*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TEMPH
202*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // QUOTE
203*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR3
204*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR4
205*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR5
206*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR6
207*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR7
208*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
209*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
210*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
211*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
212*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
213*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
214*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
215*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
216*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
217*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
218*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
219*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR0
220*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR1
221*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR2
222*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR3
223*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR4
224*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
225*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
226*b5893f02SDimitry Andric lldb_dr0_x86_64, // DR0
227*b5893f02SDimitry Andric lldb_dr1_x86_64, // DR1
228*b5893f02SDimitry Andric lldb_dr2_x86_64, // DR2
229*b5893f02SDimitry Andric lldb_dr3_x86_64, // DR3
230*b5893f02SDimitry Andric lldb_dr4_x86_64, // DR4
231*b5893f02SDimitry Andric lldb_dr5_x86_64, // DR5
232*b5893f02SDimitry Andric lldb_dr6_x86_64, // DR6
233*b5893f02SDimitry Andric lldb_dr7_x86_64, // DR7
234*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
235*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
236*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
237*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
238*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // GDTR
239*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // GDTL
240*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IDTR
241*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IDTL
242*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // LDTR
243*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TR
244*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO1
245*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO2
246*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO3
247*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO4
248*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO5
249*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO6
250*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO7
251*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO8
252*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO9
253*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
254*b5893f02SDimitry Andric lldb_st0_x86_64, // ST0
255*b5893f02SDimitry Andric lldb_st1_x86_64, // ST1
256*b5893f02SDimitry Andric lldb_st2_x86_64, // ST2
257*b5893f02SDimitry Andric lldb_st3_x86_64, // ST3
258*b5893f02SDimitry Andric lldb_st4_x86_64, // ST4
259*b5893f02SDimitry Andric lldb_st5_x86_64, // ST5
260*b5893f02SDimitry Andric lldb_st6_x86_64, // ST6
261*b5893f02SDimitry Andric lldb_st7_x86_64, // ST7
262*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CTRL
263*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // STAT
264*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TAG
265*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPIP
266*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPCS
267*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPDO
268*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPDS
269*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // ISEM
270*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPEIP
271*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPEDO
272*b5893f02SDimitry Andric lldb_mm0_x86_64, // MM0
273*b5893f02SDimitry Andric lldb_mm1_x86_64, // MM1
274*b5893f02SDimitry Andric lldb_mm2_x86_64, // MM2
275*b5893f02SDimitry Andric lldb_mm3_x86_64, // MM3
276*b5893f02SDimitry Andric lldb_mm4_x86_64, // MM4
277*b5893f02SDimitry Andric lldb_mm5_x86_64, // MM5
278*b5893f02SDimitry Andric lldb_mm6_x86_64, // MM6
279*b5893f02SDimitry Andric lldb_mm7_x86_64, // MM7
280*b5893f02SDimitry Andric lldb_xmm0_x86_64, // XMM0
281*b5893f02SDimitry Andric lldb_xmm1_x86_64, // XMM1
282*b5893f02SDimitry Andric lldb_xmm2_x86_64, // XMM2
283*b5893f02SDimitry Andric lldb_xmm3_x86_64, // XMM3
284*b5893f02SDimitry Andric lldb_xmm4_x86_64, // XMM4
285*b5893f02SDimitry Andric lldb_xmm5_x86_64, // XMM5
286*b5893f02SDimitry Andric lldb_xmm6_x86_64, // XMM6
287*b5893f02SDimitry Andric lldb_xmm7_x86_64, // XMM7
288*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
289*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
290*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
291*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
292*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
293*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
294*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
295*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
296*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
297*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
298*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
299*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
300*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
301*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
302*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
303*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
304*b5893f02SDimitry Andric LLDB_INVALID_REGNUM,
305*b5893f02SDimitry Andric lldb_mxcsr_x86_64, // MXCSR
306*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EDXEAX
307*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
308*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
309*b5893f02SDimitry Andric LLDB_INVALID_REGNUM,
310*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM0L
311*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM1L
312*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM2L
313*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM3L
314*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM4L
315*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM5L
316*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM6L
317*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM7L
318*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM0H
319*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM1H
320*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM2H
321*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM3H
322*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM4H
323*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM5H
324*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM6H
325*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM7H
326*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM00
327*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM01
328*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM10
329*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM11
330*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM20
331*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM21
332*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM30
333*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM31
334*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM40
335*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM41
336*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM50
337*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM51
338*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM60
339*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM61
340*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM70
341*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM71
342*b5893f02SDimitry Andric lldb_xmm8_x86_64, // XMM8
343*b5893f02SDimitry Andric lldb_xmm9_x86_64, // XMM9
344*b5893f02SDimitry Andric lldb_xmm10_x86_64, // XMM10
345*b5893f02SDimitry Andric lldb_xmm11_x86_64, // XMM11
346*b5893f02SDimitry Andric lldb_xmm12_x86_64, // XMM12
347*b5893f02SDimitry Andric lldb_xmm13_x86_64, // XMM13
348*b5893f02SDimitry Andric lldb_xmm14_x86_64, // XMM14
349*b5893f02SDimitry Andric lldb_xmm15_x86_64, // XMM15
350*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
351*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
352*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
353*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
354*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
355*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
356*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
357*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
358*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
359*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
360*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
361*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
362*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
363*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
364*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
365*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
366*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
367*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
368*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
369*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
370*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
371*b5893f02SDimitry Andric LLDB_INVALID_REGNUM,
372*b5893f02SDimitry Andric lldb_sil_x86_64, // SIL
373*b5893f02SDimitry Andric lldb_dil_x86_64, // DIL
374*b5893f02SDimitry Andric lldb_bpl_x86_64, // BPL
375*b5893f02SDimitry Andric lldb_spl_x86_64, // SPL
376*b5893f02SDimitry Andric lldb_rax_x86_64, // RAX
377*b5893f02SDimitry Andric lldb_rbx_x86_64, // RBX
378*b5893f02SDimitry Andric lldb_rcx_x86_64, // RCX
379*b5893f02SDimitry Andric lldb_rdx_x86_64, // RDX
380*b5893f02SDimitry Andric lldb_rsi_x86_64, // RSI
381*b5893f02SDimitry Andric lldb_rdi_x86_64, // RDI
382*b5893f02SDimitry Andric lldb_rbp_x86_64, // RBP
383*b5893f02SDimitry Andric lldb_rsp_x86_64, // RSP
384*b5893f02SDimitry Andric lldb_r8_x86_64, // R8
385*b5893f02SDimitry Andric lldb_r9_x86_64, // R9
386*b5893f02SDimitry Andric lldb_r10_x86_64, // R10
387*b5893f02SDimitry Andric lldb_r11_x86_64, // R11
388*b5893f02SDimitry Andric lldb_r12_x86_64, // R12
389*b5893f02SDimitry Andric lldb_r13_x86_64, // R13
390*b5893f02SDimitry Andric lldb_r14_x86_64, // R14
391*b5893f02SDimitry Andric lldb_r15_x86_64, // R15
392*b5893f02SDimitry Andric lldb_r8l_x86_64, // R8B
393*b5893f02SDimitry Andric lldb_r9l_x86_64, // R9B
394*b5893f02SDimitry Andric lldb_r10l_x86_64, // R10B
395*b5893f02SDimitry Andric lldb_r11l_x86_64, // R11B
396*b5893f02SDimitry Andric lldb_r12l_x86_64, // R12B
397*b5893f02SDimitry Andric lldb_r13l_x86_64, // R13B
398*b5893f02SDimitry Andric lldb_r14l_x86_64, // R14B
399*b5893f02SDimitry Andric lldb_r15l_x86_64, // R15B
400*b5893f02SDimitry Andric lldb_r8w_x86_64, // R8W
401*b5893f02SDimitry Andric lldb_r9w_x86_64, // R9W
402*b5893f02SDimitry Andric lldb_r10w_x86_64, // R10W
403*b5893f02SDimitry Andric lldb_r11w_x86_64, // R11W
404*b5893f02SDimitry Andric lldb_r12w_x86_64, // R12W
405*b5893f02SDimitry Andric lldb_r13w_x86_64, // R13W
406*b5893f02SDimitry Andric lldb_r14w_x86_64, // R14W
407*b5893f02SDimitry Andric lldb_r15w_x86_64, // R15W
408*b5893f02SDimitry Andric lldb_r8d_x86_64, // R8D
409*b5893f02SDimitry Andric lldb_r9d_x86_64, // R9D
410*b5893f02SDimitry Andric lldb_r10d_x86_64, // R10D
411*b5893f02SDimitry Andric lldb_r11d_x86_64, // R11D
412*b5893f02SDimitry Andric lldb_r12d_x86_64, // R12D
413*b5893f02SDimitry Andric lldb_r13d_x86_64, // R13D
414*b5893f02SDimitry Andric lldb_r14d_x86_64, // R14D
415*b5893f02SDimitry Andric lldb_r15d_x86_64, // R15D
416*b5893f02SDimitry Andric lldb_ymm0_x86_64, // AMD64_YMM0
417*b5893f02SDimitry Andric lldb_ymm1_x86_64, // AMD64_YMM1
418*b5893f02SDimitry Andric lldb_ymm2_x86_64, // AMD64_YMM2
419*b5893f02SDimitry Andric lldb_ymm3_x86_64, // AMD64_YMM3
420*b5893f02SDimitry Andric lldb_ymm4_x86_64, // AMD64_YMM4
421*b5893f02SDimitry Andric lldb_ymm5_x86_64, // AMD64_YMM5
422*b5893f02SDimitry Andric lldb_ymm6_x86_64, // AMD64_YMM6
423*b5893f02SDimitry Andric lldb_ymm7_x86_64, // AMD64_YMM7
424*b5893f02SDimitry Andric lldb_ymm8_x86_64, // AMD64_YMM8
425*b5893f02SDimitry Andric lldb_ymm9_x86_64, // AMD64_YMM9
426*b5893f02SDimitry Andric lldb_ymm10_x86_64, // AMD64_YMM10
427*b5893f02SDimitry Andric lldb_ymm11_x86_64, // AMD64_YMM11
428*b5893f02SDimitry Andric lldb_ymm12_x86_64, // AMD64_YMM12
429*b5893f02SDimitry Andric lldb_ymm13_x86_64, // AMD64_YMM13
430*b5893f02SDimitry Andric lldb_ymm14_x86_64, // AMD64_YMM14
431*b5893f02SDimitry Andric lldb_ymm15_x86_64, // AMD64_YMM15
432*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
433*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
434*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
435*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
436*b5893f02SDimitry Andric lldb_bnd0_x86_64, // BND0
437*b5893f02SDimitry Andric lldb_bnd1_x86_64, // BND1
438*b5893f02SDimitry Andric lldb_bnd2_x86_64 // BND2
439*b5893f02SDimitry Andric };
440*b5893f02SDimitry Andric
GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type,llvm::codeview::RegisterId register_id)441*b5893f02SDimitry Andric uint32_t GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type,
442*b5893f02SDimitry Andric llvm::codeview::RegisterId register_id) {
443*b5893f02SDimitry Andric switch (arch_type) {
444*b5893f02SDimitry Andric case llvm::Triple::x86:
445*b5893f02SDimitry Andric if (static_cast<uint16_t>(register_id) <
446*b5893f02SDimitry Andric sizeof(g_code_view_to_lldb_registers_x86) /
447*b5893f02SDimitry Andric sizeof(g_code_view_to_lldb_registers_x86[0]))
448*b5893f02SDimitry Andric return g_code_view_to_lldb_registers_x86[static_cast<uint16_t>(
449*b5893f02SDimitry Andric register_id)];
450*b5893f02SDimitry Andric
451*b5893f02SDimitry Andric switch (register_id) {
452*b5893f02SDimitry Andric case llvm::codeview::RegisterId::MXCSR:
453*b5893f02SDimitry Andric return lldb_mxcsr_i386;
454*b5893f02SDimitry Andric case llvm::codeview::RegisterId::BND0:
455*b5893f02SDimitry Andric return lldb_bnd0_i386;
456*b5893f02SDimitry Andric case llvm::codeview::RegisterId::BND1:
457*b5893f02SDimitry Andric return lldb_bnd1_i386;
458*b5893f02SDimitry Andric case llvm::codeview::RegisterId::BND2:
459*b5893f02SDimitry Andric return lldb_bnd2_i386;
460*b5893f02SDimitry Andric default:
461*b5893f02SDimitry Andric return LLDB_INVALID_REGNUM;
462*b5893f02SDimitry Andric }
463*b5893f02SDimitry Andric case llvm::Triple::x86_64:
464*b5893f02SDimitry Andric if (static_cast<uint16_t>(register_id) <
465*b5893f02SDimitry Andric sizeof(g_code_view_to_lldb_registers_x86_64) /
466*b5893f02SDimitry Andric sizeof(g_code_view_to_lldb_registers_x86_64[0]))
467*b5893f02SDimitry Andric return g_code_view_to_lldb_registers_x86_64[static_cast<uint16_t>(
468*b5893f02SDimitry Andric register_id)];
469*b5893f02SDimitry Andric
470*b5893f02SDimitry Andric return LLDB_INVALID_REGNUM;
471*b5893f02SDimitry Andric default:
472*b5893f02SDimitry Andric return LLDB_INVALID_REGNUM;
473*b5893f02SDimitry Andric }
474*b5893f02SDimitry Andric }
475*b5893f02SDimitry Andric
GetGenericRegisterNumber(llvm::codeview::RegisterId register_id)476*b5893f02SDimitry Andric uint32_t GetGenericRegisterNumber(llvm::codeview::RegisterId register_id) {
477*b5893f02SDimitry Andric if (register_id == llvm::codeview::RegisterId::VFRAME)
478*b5893f02SDimitry Andric return LLDB_REGNUM_GENERIC_FP;
479*b5893f02SDimitry Andric
480*b5893f02SDimitry Andric return LLDB_INVALID_REGNUM;
481*b5893f02SDimitry Andric }
482*b5893f02SDimitry Andric
GetRegisterNumber(llvm::Triple::ArchType arch_type,llvm::codeview::RegisterId register_id,RegisterKind & register_kind)483*b5893f02SDimitry Andric static uint32_t GetRegisterNumber(llvm::Triple::ArchType arch_type,
484*b5893f02SDimitry Andric llvm::codeview::RegisterId register_id,
485*b5893f02SDimitry Andric RegisterKind ®ister_kind) {
486*b5893f02SDimitry Andric register_kind = eRegisterKindLLDB;
487*b5893f02SDimitry Andric uint32_t reg_num = GetLLDBRegisterNumber(arch_type, register_id);
488*b5893f02SDimitry Andric if (reg_num != LLDB_INVALID_REGNUM)
489*b5893f02SDimitry Andric return reg_num;
490*b5893f02SDimitry Andric
491*b5893f02SDimitry Andric register_kind = eRegisterKindGeneric;
492*b5893f02SDimitry Andric return GetGenericRegisterNumber(register_id);
493*b5893f02SDimitry Andric }
494*b5893f02SDimitry Andric
IsSimpleTypeSignedInteger(SimpleTypeKind kind)495*b5893f02SDimitry Andric static bool IsSimpleTypeSignedInteger(SimpleTypeKind kind) {
496*b5893f02SDimitry Andric switch (kind) {
497*b5893f02SDimitry Andric case SimpleTypeKind::Int128:
498*b5893f02SDimitry Andric case SimpleTypeKind::Int64:
499*b5893f02SDimitry Andric case SimpleTypeKind::Int64Quad:
500*b5893f02SDimitry Andric case SimpleTypeKind::Int32:
501*b5893f02SDimitry Andric case SimpleTypeKind::Int32Long:
502*b5893f02SDimitry Andric case SimpleTypeKind::Int16:
503*b5893f02SDimitry Andric case SimpleTypeKind::Int16Short:
504*b5893f02SDimitry Andric case SimpleTypeKind::Float128:
505*b5893f02SDimitry Andric case SimpleTypeKind::Float80:
506*b5893f02SDimitry Andric case SimpleTypeKind::Float64:
507*b5893f02SDimitry Andric case SimpleTypeKind::Float32:
508*b5893f02SDimitry Andric case SimpleTypeKind::Float16:
509*b5893f02SDimitry Andric case SimpleTypeKind::NarrowCharacter:
510*b5893f02SDimitry Andric case SimpleTypeKind::SignedCharacter:
511*b5893f02SDimitry Andric case SimpleTypeKind::SByte:
512*b5893f02SDimitry Andric return true;
513*b5893f02SDimitry Andric default:
514*b5893f02SDimitry Andric return false;
515*b5893f02SDimitry Andric }
516*b5893f02SDimitry Andric }
517*b5893f02SDimitry Andric
GetIntegralTypeInfo(TypeIndex ti,TpiStream & tpi)518*b5893f02SDimitry Andric static std::pair<size_t, bool> GetIntegralTypeInfo(TypeIndex ti,
519*b5893f02SDimitry Andric TpiStream &tpi) {
520*b5893f02SDimitry Andric if (ti.isSimple()) {
521*b5893f02SDimitry Andric SimpleTypeKind stk = ti.getSimpleKind();
522*b5893f02SDimitry Andric return {GetTypeSizeForSimpleKind(stk), IsSimpleTypeSignedInteger(stk)};
523*b5893f02SDimitry Andric }
524*b5893f02SDimitry Andric
525*b5893f02SDimitry Andric CVType cvt = tpi.getType(ti);
526*b5893f02SDimitry Andric switch (cvt.kind()) {
527*b5893f02SDimitry Andric case LF_MODIFIER: {
528*b5893f02SDimitry Andric ModifierRecord mfr;
529*b5893f02SDimitry Andric llvm::cantFail(TypeDeserializer::deserializeAs<ModifierRecord>(cvt, mfr));
530*b5893f02SDimitry Andric return GetIntegralTypeInfo(mfr.ModifiedType, tpi);
531*b5893f02SDimitry Andric }
532*b5893f02SDimitry Andric case LF_POINTER: {
533*b5893f02SDimitry Andric PointerRecord pr;
534*b5893f02SDimitry Andric llvm::cantFail(TypeDeserializer::deserializeAs<PointerRecord>(cvt, pr));
535*b5893f02SDimitry Andric return GetIntegralTypeInfo(pr.ReferentType, tpi);
536*b5893f02SDimitry Andric }
537*b5893f02SDimitry Andric case LF_ENUM: {
538*b5893f02SDimitry Andric EnumRecord er;
539*b5893f02SDimitry Andric llvm::cantFail(TypeDeserializer::deserializeAs<EnumRecord>(cvt, er));
540*b5893f02SDimitry Andric return GetIntegralTypeInfo(er.UnderlyingType, tpi);
541*b5893f02SDimitry Andric }
542*b5893f02SDimitry Andric default:
543*b5893f02SDimitry Andric assert(false && "Type is not integral!");
544*b5893f02SDimitry Andric return {0, false};
545*b5893f02SDimitry Andric }
546*b5893f02SDimitry Andric }
547*b5893f02SDimitry Andric
548*b5893f02SDimitry Andric template <typename StreamWriter>
MakeLocationExpressionInternal(lldb::ModuleSP module,StreamWriter && writer)549*b5893f02SDimitry Andric static DWARFExpression MakeLocationExpressionInternal(lldb::ModuleSP module,
550*b5893f02SDimitry Andric StreamWriter &&writer) {
551*b5893f02SDimitry Andric const ArchSpec &architecture = module->GetArchitecture();
552*b5893f02SDimitry Andric ByteOrder byte_order = architecture.GetByteOrder();
553*b5893f02SDimitry Andric uint32_t address_size = architecture.GetAddressByteSize();
554*b5893f02SDimitry Andric uint32_t byte_size = architecture.GetDataByteSize();
555*b5893f02SDimitry Andric if (byte_order == eByteOrderInvalid || address_size == 0)
556*b5893f02SDimitry Andric return DWARFExpression(nullptr);
557*b5893f02SDimitry Andric
558*b5893f02SDimitry Andric RegisterKind register_kind = eRegisterKindDWARF;
559*b5893f02SDimitry Andric StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order);
560*b5893f02SDimitry Andric
561*b5893f02SDimitry Andric if (!writer(stream, register_kind))
562*b5893f02SDimitry Andric return DWARFExpression(nullptr);
563*b5893f02SDimitry Andric
564*b5893f02SDimitry Andric DataBufferSP buffer =
565*b5893f02SDimitry Andric std::make_shared<DataBufferHeap>(stream.GetData(), stream.GetSize());
566*b5893f02SDimitry Andric DataExtractor extractor(buffer, byte_order, address_size, byte_size);
567*b5893f02SDimitry Andric DWARFExpression result(module, extractor, nullptr, 0, buffer->GetByteSize());
568*b5893f02SDimitry Andric result.SetRegisterKind(register_kind);
569*b5893f02SDimitry Andric
570*b5893f02SDimitry Andric return result;
571*b5893f02SDimitry Andric }
572*b5893f02SDimitry Andric
MakeRegisterBasedLocationExpressionInternal(llvm::codeview::RegisterId reg,llvm::Optional<int32_t> relative_offset,lldb::ModuleSP module)573*b5893f02SDimitry Andric static DWARFExpression MakeRegisterBasedLocationExpressionInternal(
574*b5893f02SDimitry Andric llvm::codeview::RegisterId reg, llvm::Optional<int32_t> relative_offset,
575*b5893f02SDimitry Andric lldb::ModuleSP module) {
576*b5893f02SDimitry Andric return MakeLocationExpressionInternal(
577*b5893f02SDimitry Andric module, [&](Stream &stream, RegisterKind ®ister_kind) -> bool {
578*b5893f02SDimitry Andric uint32_t reg_num = GetRegisterNumber(
579*b5893f02SDimitry Andric module->GetArchitecture().GetMachine(), reg, register_kind);
580*b5893f02SDimitry Andric if (reg_num == LLDB_INVALID_REGNUM)
581*b5893f02SDimitry Andric return false;
582*b5893f02SDimitry Andric
583*b5893f02SDimitry Andric if (reg_num > 31) {
584*b5893f02SDimitry Andric llvm::dwarf::LocationAtom base = relative_offset
585*b5893f02SDimitry Andric ? llvm::dwarf::DW_OP_bregx
586*b5893f02SDimitry Andric : llvm::dwarf::DW_OP_regx;
587*b5893f02SDimitry Andric stream.PutHex8(base);
588*b5893f02SDimitry Andric stream.PutULEB128(reg_num);
589*b5893f02SDimitry Andric } else {
590*b5893f02SDimitry Andric llvm::dwarf::LocationAtom base = relative_offset
591*b5893f02SDimitry Andric ? llvm::dwarf::DW_OP_breg0
592*b5893f02SDimitry Andric : llvm::dwarf::DW_OP_reg0;
593*b5893f02SDimitry Andric stream.PutHex8(base + reg_num);
594*b5893f02SDimitry Andric }
595*b5893f02SDimitry Andric
596*b5893f02SDimitry Andric if (relative_offset)
597*b5893f02SDimitry Andric stream.PutSLEB128(*relative_offset);
598*b5893f02SDimitry Andric
599*b5893f02SDimitry Andric return true;
600*b5893f02SDimitry Andric });
601*b5893f02SDimitry Andric }
602*b5893f02SDimitry Andric
MakeEnregisteredLocationExpression(llvm::codeview::RegisterId reg,lldb::ModuleSP module)603*b5893f02SDimitry Andric DWARFExpression lldb_private::npdb::MakeEnregisteredLocationExpression(
604*b5893f02SDimitry Andric llvm::codeview::RegisterId reg, lldb::ModuleSP module) {
605*b5893f02SDimitry Andric return MakeRegisterBasedLocationExpressionInternal(reg, llvm::None, module);
606*b5893f02SDimitry Andric }
607*b5893f02SDimitry Andric
MakeRegRelLocationExpression(llvm::codeview::RegisterId reg,int32_t offset,lldb::ModuleSP module)608*b5893f02SDimitry Andric DWARFExpression lldb_private::npdb::MakeRegRelLocationExpression(
609*b5893f02SDimitry Andric llvm::codeview::RegisterId reg, int32_t offset, lldb::ModuleSP module) {
610*b5893f02SDimitry Andric return MakeRegisterBasedLocationExpressionInternal(reg, offset, module);
611*b5893f02SDimitry Andric }
612*b5893f02SDimitry Andric
MakeGlobalLocationExpression(uint16_t section,uint32_t offset,ModuleSP module)613*b5893f02SDimitry Andric DWARFExpression lldb_private::npdb::MakeGlobalLocationExpression(
614*b5893f02SDimitry Andric uint16_t section, uint32_t offset, ModuleSP module) {
615*b5893f02SDimitry Andric assert(section > 0);
616*b5893f02SDimitry Andric assert(module);
617*b5893f02SDimitry Andric
618*b5893f02SDimitry Andric return MakeLocationExpressionInternal(
619*b5893f02SDimitry Andric module, [&](Stream &stream, RegisterKind ®ister_kind) -> bool {
620*b5893f02SDimitry Andric stream.PutHex8(llvm::dwarf::DW_OP_addr);
621*b5893f02SDimitry Andric
622*b5893f02SDimitry Andric SectionList *section_list = module->GetSectionList();
623*b5893f02SDimitry Andric assert(section_list);
624*b5893f02SDimitry Andric
625*b5893f02SDimitry Andric // Section indices in PDB are 1-based, but in DWARF they are 0-based, so
626*b5893f02SDimitry Andric // we need to subtract 1.
627*b5893f02SDimitry Andric uint32_t section_idx = section - 1;
628*b5893f02SDimitry Andric if (section_idx >= section_list->GetSize())
629*b5893f02SDimitry Andric return false;
630*b5893f02SDimitry Andric
631*b5893f02SDimitry Andric auto section_ptr = section_list->GetSectionAtIndex(section_idx);
632*b5893f02SDimitry Andric if (!section_ptr)
633*b5893f02SDimitry Andric return false;
634*b5893f02SDimitry Andric
635*b5893f02SDimitry Andric stream.PutMaxHex64(section_ptr->GetFileAddress() + offset,
636*b5893f02SDimitry Andric stream.GetAddressByteSize(), stream.GetByteOrder());
637*b5893f02SDimitry Andric
638*b5893f02SDimitry Andric return true;
639*b5893f02SDimitry Andric });
640*b5893f02SDimitry Andric }
641*b5893f02SDimitry Andric
MakeConstantLocationExpression(TypeIndex underlying_ti,TpiStream & tpi,const llvm::APSInt & constant,ModuleSP module)642*b5893f02SDimitry Andric DWARFExpression lldb_private::npdb::MakeConstantLocationExpression(
643*b5893f02SDimitry Andric TypeIndex underlying_ti, TpiStream &tpi, const llvm::APSInt &constant,
644*b5893f02SDimitry Andric ModuleSP module) {
645*b5893f02SDimitry Andric const ArchSpec &architecture = module->GetArchitecture();
646*b5893f02SDimitry Andric uint32_t address_size = architecture.GetAddressByteSize();
647*b5893f02SDimitry Andric
648*b5893f02SDimitry Andric size_t size = 0;
649*b5893f02SDimitry Andric bool is_signed = false;
650*b5893f02SDimitry Andric std::tie(size, is_signed) = GetIntegralTypeInfo(underlying_ti, tpi);
651*b5893f02SDimitry Andric
652*b5893f02SDimitry Andric union {
653*b5893f02SDimitry Andric llvm::support::little64_t I;
654*b5893f02SDimitry Andric llvm::support::ulittle64_t U;
655*b5893f02SDimitry Andric } Value;
656*b5893f02SDimitry Andric
657*b5893f02SDimitry Andric std::shared_ptr<DataBufferHeap> buffer = std::make_shared<DataBufferHeap>();
658*b5893f02SDimitry Andric buffer->SetByteSize(size);
659*b5893f02SDimitry Andric
660*b5893f02SDimitry Andric llvm::ArrayRef<uint8_t> bytes;
661*b5893f02SDimitry Andric if (is_signed) {
662*b5893f02SDimitry Andric Value.I = constant.getSExtValue();
663*b5893f02SDimitry Andric } else {
664*b5893f02SDimitry Andric Value.U = constant.getZExtValue();
665*b5893f02SDimitry Andric }
666*b5893f02SDimitry Andric
667*b5893f02SDimitry Andric bytes = llvm::makeArrayRef(reinterpret_cast<const uint8_t *>(&Value), 8)
668*b5893f02SDimitry Andric .take_front(size);
669*b5893f02SDimitry Andric buffer->CopyData(bytes.data(), size);
670*b5893f02SDimitry Andric DataExtractor extractor(buffer, lldb::eByteOrderLittle, address_size);
671*b5893f02SDimitry Andric DWARFExpression result(nullptr, extractor, nullptr, 0, size);
672*b5893f02SDimitry Andric return result;
673*b5893f02SDimitry Andric }
674