14ba319b5SDimitry Andric //===-- PDBLocationToDWARFExpression.cpp ------------------------*- C++ -*-===//
24ba319b5SDimitry Andric //
34ba319b5SDimitry Andric // The LLVM Compiler Infrastructure
44ba319b5SDimitry Andric //
54ba319b5SDimitry Andric // This file is distributed under the University of Illinois Open Source
64ba319b5SDimitry Andric // License. See LICENSE.TXT for details.
74ba319b5SDimitry Andric //
84ba319b5SDimitry Andric //===----------------------------------------------------------------------===//
94ba319b5SDimitry Andric
104ba319b5SDimitry Andric #include "PDBLocationToDWARFExpression.h"
114ba319b5SDimitry Andric
124ba319b5SDimitry Andric #include "lldb/Core/Section.h"
134ba319b5SDimitry Andric #include "lldb/Core/StreamBuffer.h"
144ba319b5SDimitry Andric #include "lldb/Core/dwarf.h"
154ba319b5SDimitry Andric #include "lldb/Expression/DWARFExpression.h"
164ba319b5SDimitry Andric #include "lldb/Utility/DataBufferHeap.h"
174ba319b5SDimitry Andric
184ba319b5SDimitry Andric #include "llvm/DebugInfo/CodeView/CodeView.h"
194ba319b5SDimitry Andric #include "llvm/DebugInfo/PDB/PDBSymbolData.h"
204ba319b5SDimitry Andric
214ba319b5SDimitry Andric #include "Plugins/Process/Utility/lldb-x86-register-enums.h"
224ba319b5SDimitry Andric
234ba319b5SDimitry Andric using namespace lldb;
244ba319b5SDimitry Andric using namespace lldb_private;
254ba319b5SDimitry Andric using namespace llvm::pdb;
264ba319b5SDimitry Andric
274ba319b5SDimitry Andric namespace {
284ba319b5SDimitry Andric const uint32_t g_code_view_to_lldb_registers_x86[] = {
29*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // NONE
30*b5893f02SDimitry Andric lldb_al_i386, // AL
31*b5893f02SDimitry Andric lldb_cl_i386, // CL
32*b5893f02SDimitry Andric lldb_dl_i386, // DL
33*b5893f02SDimitry Andric lldb_bl_i386, // BL
34*b5893f02SDimitry Andric lldb_ah_i386, // AH
35*b5893f02SDimitry Andric lldb_ch_i386, // CH
36*b5893f02SDimitry Andric lldb_dh_i386, // DH
37*b5893f02SDimitry Andric lldb_bh_i386, // BH
38*b5893f02SDimitry Andric lldb_ax_i386, // AX
39*b5893f02SDimitry Andric lldb_cx_i386, // CX
40*b5893f02SDimitry Andric lldb_dx_i386, // DX
41*b5893f02SDimitry Andric lldb_bx_i386, // BX
42*b5893f02SDimitry Andric lldb_sp_i386, // SP
43*b5893f02SDimitry Andric lldb_bp_i386, // BP
44*b5893f02SDimitry Andric lldb_si_i386, // SI
45*b5893f02SDimitry Andric lldb_di_i386, // DI
46*b5893f02SDimitry Andric lldb_eax_i386, // EAX
47*b5893f02SDimitry Andric lldb_ecx_i386, // ECX
48*b5893f02SDimitry Andric lldb_edx_i386, // EDX
49*b5893f02SDimitry Andric lldb_ebx_i386, // EBX
50*b5893f02SDimitry Andric lldb_esp_i386, // ESP
51*b5893f02SDimitry Andric lldb_ebp_i386, // EBP
52*b5893f02SDimitry Andric lldb_esi_i386, // ESI
53*b5893f02SDimitry Andric lldb_edi_i386, // EDI
54*b5893f02SDimitry Andric lldb_es_i386, // ES
55*b5893f02SDimitry Andric lldb_cs_i386, // CS
56*b5893f02SDimitry Andric lldb_ss_i386, // SS
57*b5893f02SDimitry Andric lldb_ds_i386, // DS
58*b5893f02SDimitry Andric lldb_fs_i386, // FS
59*b5893f02SDimitry Andric lldb_gs_i386, // GS
60*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IP
61*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FLAGS
62*b5893f02SDimitry Andric lldb_eip_i386, // EIP
63*b5893f02SDimitry Andric lldb_eflags_i386, // EFLAGS
644ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
654ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
66*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TEMP
67*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TEMPH
68*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // QUOTE
69*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR3
70*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR4
71*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR5
72*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR6
73*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR7
744ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
754ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
764ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
774ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
784ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
794ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
804ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
814ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
824ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
834ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
844ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
85*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR0
86*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR1
87*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR2
88*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR3
89*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR4
904ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
914ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
92*b5893f02SDimitry Andric lldb_dr0_i386, // DR0
93*b5893f02SDimitry Andric lldb_dr1_i386, // DR1
94*b5893f02SDimitry Andric lldb_dr2_i386, // DR2
95*b5893f02SDimitry Andric lldb_dr3_i386, // DR3
96*b5893f02SDimitry Andric lldb_dr4_i386, // DR4
97*b5893f02SDimitry Andric lldb_dr5_i386, // DR5
98*b5893f02SDimitry Andric lldb_dr6_i386, // DR6
99*b5893f02SDimitry Andric lldb_dr7_i386, // DR7
1004ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1014ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1024ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1034ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
104*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // GDTR
105*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // GDTL
106*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IDTR
107*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IDTL
108*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // LDTR
109*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TR
110*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO1
111*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO2
112*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO3
113*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO4
114*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO5
115*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO6
116*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO7
117*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO8
118*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO9
1194ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
120*b5893f02SDimitry Andric lldb_st0_i386, // ST0
121*b5893f02SDimitry Andric lldb_st1_i386, // ST1
122*b5893f02SDimitry Andric lldb_st2_i386, // ST2
123*b5893f02SDimitry Andric lldb_st3_i386, // ST3
124*b5893f02SDimitry Andric lldb_st4_i386, // ST4
125*b5893f02SDimitry Andric lldb_st5_i386, // ST5
126*b5893f02SDimitry Andric lldb_st6_i386, // ST6
127*b5893f02SDimitry Andric lldb_st7_i386, // ST7
128*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CTRL
129*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // STAT
130*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TAG
131*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPIP
132*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPCS
133*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPDO
134*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPDS
135*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // ISEM
136*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPEIP
137*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPEDO
138*b5893f02SDimitry Andric lldb_mm0_i386, // MM0
139*b5893f02SDimitry Andric lldb_mm1_i386, // MM1
140*b5893f02SDimitry Andric lldb_mm2_i386, // MM2
141*b5893f02SDimitry Andric lldb_mm3_i386, // MM3
142*b5893f02SDimitry Andric lldb_mm4_i386, // MM4
143*b5893f02SDimitry Andric lldb_mm5_i386, // MM5
144*b5893f02SDimitry Andric lldb_mm6_i386, // MM6
145*b5893f02SDimitry Andric lldb_mm7_i386, // MM7
146*b5893f02SDimitry Andric lldb_xmm0_i386, // XMM0
147*b5893f02SDimitry Andric lldb_xmm1_i386, // XMM1
148*b5893f02SDimitry Andric lldb_xmm2_i386, // XMM2
149*b5893f02SDimitry Andric lldb_xmm3_i386, // XMM3
150*b5893f02SDimitry Andric lldb_xmm4_i386, // XMM4
151*b5893f02SDimitry Andric lldb_xmm5_i386, // XMM5
152*b5893f02SDimitry Andric lldb_xmm6_i386, // XMM6
153*b5893f02SDimitry Andric lldb_xmm7_i386 // XMM7
1544ba319b5SDimitry Andric };
1554ba319b5SDimitry Andric
1564ba319b5SDimitry Andric const uint32_t g_code_view_to_lldb_registers_x86_64[] = {
157*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // NONE
158*b5893f02SDimitry Andric lldb_al_x86_64, // AL
159*b5893f02SDimitry Andric lldb_cl_x86_64, // CL
160*b5893f02SDimitry Andric lldb_dl_x86_64, // DL
161*b5893f02SDimitry Andric lldb_bl_x86_64, // BL
162*b5893f02SDimitry Andric lldb_ah_x86_64, // AH
163*b5893f02SDimitry Andric lldb_ch_x86_64, // CH
164*b5893f02SDimitry Andric lldb_dh_x86_64, // DH
165*b5893f02SDimitry Andric lldb_bh_x86_64, // BH
166*b5893f02SDimitry Andric lldb_ax_x86_64, // AX
167*b5893f02SDimitry Andric lldb_cx_x86_64, // CX
168*b5893f02SDimitry Andric lldb_dx_x86_64, // DX
169*b5893f02SDimitry Andric lldb_bx_x86_64, // BX
170*b5893f02SDimitry Andric lldb_sp_x86_64, // SP
171*b5893f02SDimitry Andric lldb_bp_x86_64, // BP
172*b5893f02SDimitry Andric lldb_si_x86_64, // SI
173*b5893f02SDimitry Andric lldb_di_x86_64, // DI
174*b5893f02SDimitry Andric lldb_eax_x86_64, // EAX
175*b5893f02SDimitry Andric lldb_ecx_x86_64, // ECX
176*b5893f02SDimitry Andric lldb_edx_x86_64, // EDX
177*b5893f02SDimitry Andric lldb_ebx_x86_64, // EBX
178*b5893f02SDimitry Andric lldb_esp_x86_64, // ESP
179*b5893f02SDimitry Andric lldb_ebp_x86_64, // EBP
180*b5893f02SDimitry Andric lldb_esi_x86_64, // ESI
181*b5893f02SDimitry Andric lldb_edi_x86_64, // EDI
182*b5893f02SDimitry Andric lldb_es_x86_64, // ES
183*b5893f02SDimitry Andric lldb_cs_x86_64, // CS
184*b5893f02SDimitry Andric lldb_ss_x86_64, // SS
185*b5893f02SDimitry Andric lldb_ds_x86_64, // DS
186*b5893f02SDimitry Andric lldb_fs_x86_64, // FS
187*b5893f02SDimitry Andric lldb_gs_x86_64, // GS
188*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IP
189*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FLAGS
190*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EIP
191*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EFLAGS
1924ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
1934ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
194*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TEMP
195*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TEMPH
196*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // QUOTE
197*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR3
198*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR4
199*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR5
200*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR6
201*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PCDR7
2024ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2034ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2044ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2054ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2064ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2074ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2084ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2094ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2104ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2114ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2124ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
213*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR0
214*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR1
215*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR2
216*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR3
217*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CR4
2184ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2194ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
220*b5893f02SDimitry Andric lldb_dr0_x86_64, // DR0
221*b5893f02SDimitry Andric lldb_dr1_x86_64, // DR1
222*b5893f02SDimitry Andric lldb_dr2_x86_64, // DR2
223*b5893f02SDimitry Andric lldb_dr3_x86_64, // DR3
224*b5893f02SDimitry Andric lldb_dr4_x86_64, // DR4
225*b5893f02SDimitry Andric lldb_dr5_x86_64, // DR5
226*b5893f02SDimitry Andric lldb_dr6_x86_64, // DR6
227*b5893f02SDimitry Andric lldb_dr7_x86_64, // DR7
2284ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2294ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2304ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2314ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
232*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // GDTR
233*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // GDTL
234*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IDTR
235*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // IDTL
236*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // LDTR
237*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TR
238*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO1
239*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO2
240*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO3
241*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO4
242*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO5
243*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO6
244*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO7
245*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO8
246*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // PSEUDO9
2474ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
248*b5893f02SDimitry Andric lldb_st0_x86_64, // ST0
249*b5893f02SDimitry Andric lldb_st1_x86_64, // ST1
250*b5893f02SDimitry Andric lldb_st2_x86_64, // ST2
251*b5893f02SDimitry Andric lldb_st3_x86_64, // ST3
252*b5893f02SDimitry Andric lldb_st4_x86_64, // ST4
253*b5893f02SDimitry Andric lldb_st5_x86_64, // ST5
254*b5893f02SDimitry Andric lldb_st6_x86_64, // ST6
255*b5893f02SDimitry Andric lldb_st7_x86_64, // ST7
256*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // CTRL
257*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // STAT
258*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // TAG
259*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPIP
260*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPCS
261*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPDO
262*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPDS
263*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // ISEM
264*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPEIP
265*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // FPEDO
266*b5893f02SDimitry Andric lldb_mm0_x86_64, // MM0
267*b5893f02SDimitry Andric lldb_mm1_x86_64, // MM1
268*b5893f02SDimitry Andric lldb_mm2_x86_64, // MM2
269*b5893f02SDimitry Andric lldb_mm3_x86_64, // MM3
270*b5893f02SDimitry Andric lldb_mm4_x86_64, // MM4
271*b5893f02SDimitry Andric lldb_mm5_x86_64, // MM5
272*b5893f02SDimitry Andric lldb_mm6_x86_64, // MM6
273*b5893f02SDimitry Andric lldb_mm7_x86_64, // MM7
274*b5893f02SDimitry Andric lldb_xmm0_x86_64, // XMM0
275*b5893f02SDimitry Andric lldb_xmm1_x86_64, // XMM1
276*b5893f02SDimitry Andric lldb_xmm2_x86_64, // XMM2
277*b5893f02SDimitry Andric lldb_xmm3_x86_64, // XMM3
278*b5893f02SDimitry Andric lldb_xmm4_x86_64, // XMM4
279*b5893f02SDimitry Andric lldb_xmm5_x86_64, // XMM5
280*b5893f02SDimitry Andric lldb_xmm6_x86_64, // XMM6
281*b5893f02SDimitry Andric lldb_xmm7_x86_64, // XMM7
2824ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2834ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2844ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2854ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2864ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2874ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2884ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2894ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2904ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2914ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2924ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2934ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2944ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2954ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2964ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2974ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
2984ba319b5SDimitry Andric LLDB_INVALID_REGNUM,
299*b5893f02SDimitry Andric lldb_mxcsr_x86_64, // MXCSR
300*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EDXEAX
3014ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3024ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3034ba319b5SDimitry Andric LLDB_INVALID_REGNUM,
304*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM0L
305*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM1L
306*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM2L
307*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM3L
308*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM4L
309*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM5L
310*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM6L
311*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM7L
312*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM0H
313*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM1H
314*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM2H
315*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM3H
316*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM4H
317*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM5H
318*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM6H
319*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // EMM7H
320*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM00
321*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM01
322*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM10
323*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM11
324*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM20
325*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM21
326*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM30
327*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM31
328*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM40
329*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM41
330*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM50
331*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM51
332*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM60
333*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM61
334*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM70
335*b5893f02SDimitry Andric LLDB_INVALID_REGNUM, // MM71
336*b5893f02SDimitry Andric lldb_xmm8_x86_64, // XMM8
337*b5893f02SDimitry Andric lldb_xmm9_x86_64, // XMM9
338*b5893f02SDimitry Andric lldb_xmm10_x86_64, // XMM10
339*b5893f02SDimitry Andric lldb_xmm11_x86_64, // XMM11
340*b5893f02SDimitry Andric lldb_xmm12_x86_64, // XMM12
341*b5893f02SDimitry Andric lldb_xmm13_x86_64, // XMM13
342*b5893f02SDimitry Andric lldb_xmm14_x86_64, // XMM14
343*b5893f02SDimitry Andric lldb_xmm15_x86_64, // XMM15
3444ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3454ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3464ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3474ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3484ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3494ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3504ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3514ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3524ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3534ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3544ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3554ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3564ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3574ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3584ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3594ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3604ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3614ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3624ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3634ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3644ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3654ba319b5SDimitry Andric LLDB_INVALID_REGNUM,
366*b5893f02SDimitry Andric lldb_sil_x86_64, // SIL
367*b5893f02SDimitry Andric lldb_dil_x86_64, // DIL
368*b5893f02SDimitry Andric lldb_bpl_x86_64, // BPL
369*b5893f02SDimitry Andric lldb_spl_x86_64, // SPL
370*b5893f02SDimitry Andric lldb_rax_x86_64, // RAX
371*b5893f02SDimitry Andric lldb_rbx_x86_64, // RBX
372*b5893f02SDimitry Andric lldb_rcx_x86_64, // RCX
373*b5893f02SDimitry Andric lldb_rdx_x86_64, // RDX
374*b5893f02SDimitry Andric lldb_rsi_x86_64, // RSI
375*b5893f02SDimitry Andric lldb_rdi_x86_64, // RDI
376*b5893f02SDimitry Andric lldb_rbp_x86_64, // RBP
377*b5893f02SDimitry Andric lldb_rsp_x86_64, // RSP
378*b5893f02SDimitry Andric lldb_r8_x86_64, // R8
379*b5893f02SDimitry Andric lldb_r9_x86_64, // R9
380*b5893f02SDimitry Andric lldb_r10_x86_64, // R10
381*b5893f02SDimitry Andric lldb_r11_x86_64, // R11
382*b5893f02SDimitry Andric lldb_r12_x86_64, // R12
383*b5893f02SDimitry Andric lldb_r13_x86_64, // R13
384*b5893f02SDimitry Andric lldb_r14_x86_64, // R14
385*b5893f02SDimitry Andric lldb_r15_x86_64, // R15
386*b5893f02SDimitry Andric lldb_r8l_x86_64, // R8B
387*b5893f02SDimitry Andric lldb_r9l_x86_64, // R9B
388*b5893f02SDimitry Andric lldb_r10l_x86_64, // R10B
389*b5893f02SDimitry Andric lldb_r11l_x86_64, // R11B
390*b5893f02SDimitry Andric lldb_r12l_x86_64, // R12B
391*b5893f02SDimitry Andric lldb_r13l_x86_64, // R13B
392*b5893f02SDimitry Andric lldb_r14l_x86_64, // R14B
393*b5893f02SDimitry Andric lldb_r15l_x86_64, // R15B
394*b5893f02SDimitry Andric lldb_r8w_x86_64, // R8W
395*b5893f02SDimitry Andric lldb_r9w_x86_64, // R9W
396*b5893f02SDimitry Andric lldb_r10w_x86_64, // R10W
397*b5893f02SDimitry Andric lldb_r11w_x86_64, // R11W
398*b5893f02SDimitry Andric lldb_r12w_x86_64, // R12W
399*b5893f02SDimitry Andric lldb_r13w_x86_64, // R13W
400*b5893f02SDimitry Andric lldb_r14w_x86_64, // R14W
401*b5893f02SDimitry Andric lldb_r15w_x86_64, // R15W
402*b5893f02SDimitry Andric lldb_r8d_x86_64, // R8D
403*b5893f02SDimitry Andric lldb_r9d_x86_64, // R9D
404*b5893f02SDimitry Andric lldb_r10d_x86_64, // R10D
405*b5893f02SDimitry Andric lldb_r11d_x86_64, // R11D
406*b5893f02SDimitry Andric lldb_r12d_x86_64, // R12D
407*b5893f02SDimitry Andric lldb_r13d_x86_64, // R13D
408*b5893f02SDimitry Andric lldb_r14d_x86_64, // R14D
409*b5893f02SDimitry Andric lldb_r15d_x86_64, // R15D
410*b5893f02SDimitry Andric lldb_ymm0_x86_64, // AMD64_YMM0
411*b5893f02SDimitry Andric lldb_ymm1_x86_64, // AMD64_YMM1
412*b5893f02SDimitry Andric lldb_ymm2_x86_64, // AMD64_YMM2
413*b5893f02SDimitry Andric lldb_ymm3_x86_64, // AMD64_YMM3
414*b5893f02SDimitry Andric lldb_ymm4_x86_64, // AMD64_YMM4
415*b5893f02SDimitry Andric lldb_ymm5_x86_64, // AMD64_YMM5
416*b5893f02SDimitry Andric lldb_ymm6_x86_64, // AMD64_YMM6
417*b5893f02SDimitry Andric lldb_ymm7_x86_64, // AMD64_YMM7
418*b5893f02SDimitry Andric lldb_ymm8_x86_64, // AMD64_YMM8
419*b5893f02SDimitry Andric lldb_ymm9_x86_64, // AMD64_YMM9
420*b5893f02SDimitry Andric lldb_ymm10_x86_64, // AMD64_YMM10
421*b5893f02SDimitry Andric lldb_ymm11_x86_64, // AMD64_YMM11
422*b5893f02SDimitry Andric lldb_ymm12_x86_64, // AMD64_YMM12
423*b5893f02SDimitry Andric lldb_ymm13_x86_64, // AMD64_YMM13
424*b5893f02SDimitry Andric lldb_ymm14_x86_64, // AMD64_YMM14
425*b5893f02SDimitry Andric lldb_ymm15_x86_64, // AMD64_YMM15
4264ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
4274ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
4284ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
4294ba319b5SDimitry Andric LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
430*b5893f02SDimitry Andric lldb_bnd0_x86_64, // BND0
431*b5893f02SDimitry Andric lldb_bnd1_x86_64, // BND1
432*b5893f02SDimitry Andric lldb_bnd2_x86_64 // BND2
4334ba319b5SDimitry Andric };
4344ba319b5SDimitry Andric
GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type,llvm::codeview::RegisterId register_id)4354ba319b5SDimitry Andric uint32_t GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type,
4364ba319b5SDimitry Andric llvm::codeview::RegisterId register_id) {
4374ba319b5SDimitry Andric switch (arch_type) {
4384ba319b5SDimitry Andric case llvm::Triple::x86:
4394ba319b5SDimitry Andric if (static_cast<uint16_t>(register_id) <
4404ba319b5SDimitry Andric sizeof(g_code_view_to_lldb_registers_x86) /
4414ba319b5SDimitry Andric sizeof(g_code_view_to_lldb_registers_x86[0]))
4424ba319b5SDimitry Andric return g_code_view_to_lldb_registers_x86[static_cast<uint16_t>(
4434ba319b5SDimitry Andric register_id)];
4444ba319b5SDimitry Andric
4454ba319b5SDimitry Andric switch (register_id) {
446*b5893f02SDimitry Andric case llvm::codeview::RegisterId::MXCSR:
4474ba319b5SDimitry Andric return lldb_mxcsr_i386;
448*b5893f02SDimitry Andric case llvm::codeview::RegisterId::BND0:
4494ba319b5SDimitry Andric return lldb_bnd0_i386;
450*b5893f02SDimitry Andric case llvm::codeview::RegisterId::BND1:
4514ba319b5SDimitry Andric return lldb_bnd1_i386;
452*b5893f02SDimitry Andric case llvm::codeview::RegisterId::BND2:
4534ba319b5SDimitry Andric return lldb_bnd2_i386;
4544ba319b5SDimitry Andric default:
4554ba319b5SDimitry Andric return LLDB_INVALID_REGNUM;
4564ba319b5SDimitry Andric }
4574ba319b5SDimitry Andric case llvm::Triple::x86_64:
4584ba319b5SDimitry Andric if (static_cast<uint16_t>(register_id) <
4594ba319b5SDimitry Andric sizeof(g_code_view_to_lldb_registers_x86_64) /
4604ba319b5SDimitry Andric sizeof(g_code_view_to_lldb_registers_x86_64[0]))
4614ba319b5SDimitry Andric return g_code_view_to_lldb_registers_x86_64[static_cast<uint16_t>(
4624ba319b5SDimitry Andric register_id)];
4634ba319b5SDimitry Andric
4644ba319b5SDimitry Andric return LLDB_INVALID_REGNUM;
4654ba319b5SDimitry Andric default:
4664ba319b5SDimitry Andric return LLDB_INVALID_REGNUM;
4674ba319b5SDimitry Andric }
4684ba319b5SDimitry Andric }
4694ba319b5SDimitry Andric
GetGenericRegisterNumber(llvm::codeview::RegisterId register_id)4704ba319b5SDimitry Andric uint32_t GetGenericRegisterNumber(llvm::codeview::RegisterId register_id) {
471*b5893f02SDimitry Andric if (register_id == llvm::codeview::RegisterId::VFRAME)
4724ba319b5SDimitry Andric return LLDB_REGNUM_GENERIC_FP;
4734ba319b5SDimitry Andric
4744ba319b5SDimitry Andric return LLDB_INVALID_REGNUM;
4754ba319b5SDimitry Andric }
4764ba319b5SDimitry Andric
GetRegisterNumber(llvm::Triple::ArchType arch_type,llvm::codeview::RegisterId register_id,RegisterKind & register_kind)4774ba319b5SDimitry Andric uint32_t GetRegisterNumber(llvm::Triple::ArchType arch_type,
4784ba319b5SDimitry Andric llvm::codeview::RegisterId register_id,
4794ba319b5SDimitry Andric RegisterKind ®ister_kind) {
4804ba319b5SDimitry Andric register_kind = eRegisterKindLLDB;
4814ba319b5SDimitry Andric uint32_t reg_num = GetLLDBRegisterNumber(arch_type, register_id);
4824ba319b5SDimitry Andric if (reg_num != LLDB_INVALID_REGNUM)
4834ba319b5SDimitry Andric return reg_num;
4844ba319b5SDimitry Andric
4854ba319b5SDimitry Andric register_kind = eRegisterKindGeneric;
4864ba319b5SDimitry Andric return GetGenericRegisterNumber(register_id);
4874ba319b5SDimitry Andric }
4884ba319b5SDimitry Andric } // namespace
4894ba319b5SDimitry Andric
ConvertPDBLocationToDWARFExpression(ModuleSP module,const PDBSymbolData & symbol,bool & is_constant)4904ba319b5SDimitry Andric DWARFExpression ConvertPDBLocationToDWARFExpression(ModuleSP module,
4914ba319b5SDimitry Andric const PDBSymbolData &symbol,
4924ba319b5SDimitry Andric bool &is_constant) {
4934ba319b5SDimitry Andric is_constant = true;
4944ba319b5SDimitry Andric
4954ba319b5SDimitry Andric if (!module)
4964ba319b5SDimitry Andric return DWARFExpression(nullptr);
4974ba319b5SDimitry Andric
4984ba319b5SDimitry Andric const ArchSpec &architecture = module->GetArchitecture();
4994ba319b5SDimitry Andric llvm::Triple::ArchType arch_type = architecture.GetMachine();
5004ba319b5SDimitry Andric ByteOrder byte_order = architecture.GetByteOrder();
5014ba319b5SDimitry Andric uint32_t address_size = architecture.GetAddressByteSize();
5024ba319b5SDimitry Andric uint32_t byte_size = architecture.GetDataByteSize();
5034ba319b5SDimitry Andric if (byte_order == eByteOrderInvalid || address_size == 0)
5044ba319b5SDimitry Andric return DWARFExpression(nullptr);
5054ba319b5SDimitry Andric
5064ba319b5SDimitry Andric RegisterKind register_kind = eRegisterKindDWARF;
5074ba319b5SDimitry Andric StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order);
5084ba319b5SDimitry Andric switch (symbol.getLocationType()) {
5094ba319b5SDimitry Andric case PDB_LocType::Static:
5104ba319b5SDimitry Andric case PDB_LocType::TLS: {
5114ba319b5SDimitry Andric stream.PutHex8(DW_OP_addr);
5124ba319b5SDimitry Andric
5134ba319b5SDimitry Andric SectionList *section_list = module->GetSectionList();
5144ba319b5SDimitry Andric if (!section_list)
5154ba319b5SDimitry Andric return DWARFExpression(nullptr);
5164ba319b5SDimitry Andric
5174ba319b5SDimitry Andric uint32_t section_idx = symbol.getAddressSection() - 1;
5184ba319b5SDimitry Andric if (section_idx >= section_list->GetSize())
5194ba319b5SDimitry Andric return DWARFExpression(nullptr);
5204ba319b5SDimitry Andric
5214ba319b5SDimitry Andric auto section = section_list->GetSectionAtIndex(section_idx);
5224ba319b5SDimitry Andric if (!section)
5234ba319b5SDimitry Andric return DWARFExpression(nullptr);
5244ba319b5SDimitry Andric
5254ba319b5SDimitry Andric uint32_t offset = symbol.getAddressOffset();
5264ba319b5SDimitry Andric stream.PutMaxHex64(section->GetFileAddress() + offset, address_size,
5274ba319b5SDimitry Andric byte_order);
5284ba319b5SDimitry Andric
5294ba319b5SDimitry Andric is_constant = false;
5304ba319b5SDimitry Andric
5314ba319b5SDimitry Andric break;
5324ba319b5SDimitry Andric }
5334ba319b5SDimitry Andric case PDB_LocType::RegRel: {
5344ba319b5SDimitry Andric uint32_t reg_num =
5354ba319b5SDimitry Andric GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind);
5364ba319b5SDimitry Andric if (reg_num == LLDB_INVALID_REGNUM)
5374ba319b5SDimitry Andric return DWARFExpression(nullptr);
5384ba319b5SDimitry Andric
5394ba319b5SDimitry Andric if (reg_num > 31) {
5404ba319b5SDimitry Andric stream.PutHex8(DW_OP_bregx);
5414ba319b5SDimitry Andric stream.PutULEB128(reg_num);
5424ba319b5SDimitry Andric } else
5434ba319b5SDimitry Andric stream.PutHex8(DW_OP_breg0 + reg_num);
5444ba319b5SDimitry Andric
5454ba319b5SDimitry Andric int32_t offset = symbol.getOffset();
5464ba319b5SDimitry Andric stream.PutSLEB128(offset);
5474ba319b5SDimitry Andric
5484ba319b5SDimitry Andric is_constant = false;
5494ba319b5SDimitry Andric
5504ba319b5SDimitry Andric break;
5514ba319b5SDimitry Andric }
5524ba319b5SDimitry Andric case PDB_LocType::Enregistered: {
5534ba319b5SDimitry Andric uint32_t reg_num =
5544ba319b5SDimitry Andric GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind);
5554ba319b5SDimitry Andric if (reg_num == LLDB_INVALID_REGNUM)
5564ba319b5SDimitry Andric return DWARFExpression(nullptr);
5574ba319b5SDimitry Andric
5584ba319b5SDimitry Andric if (reg_num > 31) {
5594ba319b5SDimitry Andric stream.PutHex8(DW_OP_regx);
5604ba319b5SDimitry Andric stream.PutULEB128(reg_num);
5614ba319b5SDimitry Andric } else
5624ba319b5SDimitry Andric stream.PutHex8(DW_OP_reg0 + reg_num);
5634ba319b5SDimitry Andric
5644ba319b5SDimitry Andric is_constant = false;
5654ba319b5SDimitry Andric
5664ba319b5SDimitry Andric break;
5674ba319b5SDimitry Andric }
5684ba319b5SDimitry Andric case PDB_LocType::Constant: {
5694ba319b5SDimitry Andric Variant value = symbol.getValue();
5704ba319b5SDimitry Andric stream.PutRawBytes(&value.Value, sizeof(value.Value),
5714ba319b5SDimitry Andric endian::InlHostByteOrder());
5724ba319b5SDimitry Andric break;
5734ba319b5SDimitry Andric }
5744ba319b5SDimitry Andric default:
5754ba319b5SDimitry Andric return DWARFExpression(nullptr);
5764ba319b5SDimitry Andric }
5774ba319b5SDimitry Andric
5784ba319b5SDimitry Andric DataBufferSP buffer =
5794ba319b5SDimitry Andric std::make_shared<DataBufferHeap>(stream.GetData(), stream.GetSize());
5804ba319b5SDimitry Andric DataExtractor extractor(buffer, byte_order, address_size, byte_size);
5814ba319b5SDimitry Andric DWARFExpression result(module, extractor, nullptr, 0, buffer->GetByteSize());
5824ba319b5SDimitry Andric result.SetRegisterKind(register_kind);
5834ba319b5SDimitry Andric
5844ba319b5SDimitry Andric return result;
5854ba319b5SDimitry Andric }
586