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 &register_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