1 //===-- PDBLocationToDWARFExpression.cpp ------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "PDBLocationToDWARFExpression.h" 11 12 #include "lldb/Core/Section.h" 13 #include "lldb/Core/StreamBuffer.h" 14 #include "lldb/Core/dwarf.h" 15 #include "lldb/Expression/DWARFExpression.h" 16 #include "lldb/Utility/DataBufferHeap.h" 17 18 #include "llvm/DebugInfo/CodeView/CodeView.h" 19 #include "llvm/DebugInfo/PDB/PDBSymbolData.h" 20 21 #include "Plugins/Process/Utility/lldb-x86-register-enums.h" 22 23 using namespace lldb; 24 using namespace lldb_private; 25 using namespace llvm::pdb; 26 27 namespace { 28 const uint32_t g_code_view_to_lldb_registers_x86[] = { 29 LLDB_INVALID_REGNUM, // CVRegNONE 30 lldb_al_i386, // CVRegAL 31 lldb_cl_i386, // CVRegCL 32 lldb_dl_i386, // CVRegDL 33 lldb_bl_i386, // CVRegBL 34 lldb_ah_i386, // CVRegAH 35 lldb_ch_i386, // CVRegCH 36 lldb_dh_i386, // CVRegDH 37 lldb_bh_i386, // CVRegBH 38 lldb_ax_i386, // CVRegAX 39 lldb_cx_i386, // CVRegCX 40 lldb_dx_i386, // CVRegDX 41 lldb_bx_i386, // CVRegBX 42 lldb_sp_i386, // CVRegSP 43 lldb_bp_i386, // CVRegBP 44 lldb_si_i386, // CVRegSI 45 lldb_di_i386, // CVRegDI 46 lldb_eax_i386, // CVRegEAX 47 lldb_ecx_i386, // CVRegECX 48 lldb_edx_i386, // CVRegEDX 49 lldb_ebx_i386, // CVRegEBX 50 lldb_esp_i386, // CVRegESP 51 lldb_ebp_i386, // CVRegEBP 52 lldb_esi_i386, // CVRegESI 53 lldb_edi_i386, // CVRegEDI 54 lldb_es_i386, // CVRegES 55 lldb_cs_i386, // CVRegCS 56 lldb_ss_i386, // CVRegSS 57 lldb_ds_i386, // CVRegDS 58 lldb_fs_i386, // CVRegFS 59 lldb_gs_i386, // CVRegGS 60 LLDB_INVALID_REGNUM, // CVRegIP 61 LLDB_INVALID_REGNUM, // CVRegFLAGS 62 lldb_eip_i386, // CVRegEIP 63 lldb_eflags_i386, // CVRegEFLAGS 64 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 65 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 66 LLDB_INVALID_REGNUM, // CVRegTEMP 67 LLDB_INVALID_REGNUM, // CVRegTEMPH 68 LLDB_INVALID_REGNUM, // CVRegQUOTE 69 LLDB_INVALID_REGNUM, // CVRegPCDR3 70 LLDB_INVALID_REGNUM, // CVRegPCDR4 71 LLDB_INVALID_REGNUM, // CVRegPCDR5 72 LLDB_INVALID_REGNUM, // CVRegPCDR6 73 LLDB_INVALID_REGNUM, // CVRegPCDR7 74 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 75 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 76 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 77 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 78 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 79 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 80 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 81 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 82 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 83 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 84 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 85 LLDB_INVALID_REGNUM, // CVRegCR0 86 LLDB_INVALID_REGNUM, // CVRegCR1 87 LLDB_INVALID_REGNUM, // CVRegCR2 88 LLDB_INVALID_REGNUM, // CVRegCR3 89 LLDB_INVALID_REGNUM, // CVRegCR4 90 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 91 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 92 lldb_dr0_i386, // CVRegDR0 93 lldb_dr1_i386, // CVRegDR1 94 lldb_dr2_i386, // CVRegDR2 95 lldb_dr3_i386, // CVRegDR3 96 lldb_dr4_i386, // CVRegDR4 97 lldb_dr5_i386, // CVRegDR5 98 lldb_dr6_i386, // CVRegDR6 99 lldb_dr7_i386, // CVRegDR7 100 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 101 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 102 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 103 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 104 LLDB_INVALID_REGNUM, // CVRegGDTR 105 LLDB_INVALID_REGNUM, // CVRegGDTL 106 LLDB_INVALID_REGNUM, // CVRegIDTR 107 LLDB_INVALID_REGNUM, // CVRegIDTL 108 LLDB_INVALID_REGNUM, // CVRegLDTR 109 LLDB_INVALID_REGNUM, // CVRegTR 110 LLDB_INVALID_REGNUM, // CVRegPSEUDO1 111 LLDB_INVALID_REGNUM, // CVRegPSEUDO2 112 LLDB_INVALID_REGNUM, // CVRegPSEUDO3 113 LLDB_INVALID_REGNUM, // CVRegPSEUDO4 114 LLDB_INVALID_REGNUM, // CVRegPSEUDO5 115 LLDB_INVALID_REGNUM, // CVRegPSEUDO6 116 LLDB_INVALID_REGNUM, // CVRegPSEUDO7 117 LLDB_INVALID_REGNUM, // CVRegPSEUDO8 118 LLDB_INVALID_REGNUM, // CVRegPSEUDO9 119 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 120 lldb_st0_i386, // CVRegST0 121 lldb_st1_i386, // CVRegST1 122 lldb_st2_i386, // CVRegST2 123 lldb_st3_i386, // CVRegST3 124 lldb_st4_i386, // CVRegST4 125 lldb_st5_i386, // CVRegST5 126 lldb_st6_i386, // CVRegST6 127 lldb_st7_i386, // CVRegST7 128 LLDB_INVALID_REGNUM, // CVRegCTRL 129 LLDB_INVALID_REGNUM, // CVRegSTAT 130 LLDB_INVALID_REGNUM, // CVRegTAG 131 LLDB_INVALID_REGNUM, // CVRegFPIP 132 LLDB_INVALID_REGNUM, // CVRegFPCS 133 LLDB_INVALID_REGNUM, // CVRegFPDO 134 LLDB_INVALID_REGNUM, // CVRegFPDS 135 LLDB_INVALID_REGNUM, // CVRegISEM 136 LLDB_INVALID_REGNUM, // CVRegFPEIP 137 LLDB_INVALID_REGNUM, // CVRegFPEDO 138 lldb_mm0_i386, // CVRegMM0 139 lldb_mm1_i386, // CVRegMM1 140 lldb_mm2_i386, // CVRegMM2 141 lldb_mm3_i386, // CVRegMM3 142 lldb_mm4_i386, // CVRegMM4 143 lldb_mm5_i386, // CVRegMM5 144 lldb_mm6_i386, // CVRegMM6 145 lldb_mm7_i386, // CVRegMM7 146 lldb_xmm0_i386, // CVRegXMM0 147 lldb_xmm1_i386, // CVRegXMM1 148 lldb_xmm2_i386, // CVRegXMM2 149 lldb_xmm3_i386, // CVRegXMM3 150 lldb_xmm4_i386, // CVRegXMM4 151 lldb_xmm5_i386, // CVRegXMM5 152 lldb_xmm6_i386, // CVRegXMM6 153 lldb_xmm7_i386 // CVRegXMM7 154 }; 155 156 const uint32_t g_code_view_to_lldb_registers_x86_64[] = { 157 LLDB_INVALID_REGNUM, // CVRegNONE 158 lldb_al_x86_64, // CVRegAL 159 lldb_cl_x86_64, // CVRegCL 160 lldb_dl_x86_64, // CVRegDL 161 lldb_bl_x86_64, // CVRegBL 162 lldb_ah_x86_64, // CVRegAH 163 lldb_ch_x86_64, // CVRegCH 164 lldb_dh_x86_64, // CVRegDH 165 lldb_bh_x86_64, // CVRegBH 166 lldb_ax_x86_64, // CVRegAX 167 lldb_cx_x86_64, // CVRegCX 168 lldb_dx_x86_64, // CVRegDX 169 lldb_bx_x86_64, // CVRegBX 170 lldb_sp_x86_64, // CVRegSP 171 lldb_bp_x86_64, // CVRegBP 172 lldb_si_x86_64, // CVRegSI 173 lldb_di_x86_64, // CVRegDI 174 lldb_eax_x86_64, // CVRegEAX 175 lldb_ecx_x86_64, // CVRegECX 176 lldb_edx_x86_64, // CVRegEDX 177 lldb_ebx_x86_64, // CVRegEBX 178 lldb_esp_x86_64, // CVRegESP 179 lldb_ebp_x86_64, // CVRegEBP 180 lldb_esi_x86_64, // CVRegESI 181 lldb_edi_x86_64, // CVRegEDI 182 lldb_es_x86_64, // CVRegES 183 lldb_cs_x86_64, // CVRegCS 184 lldb_ss_x86_64, // CVRegSS 185 lldb_ds_x86_64, // CVRegDS 186 lldb_fs_x86_64, // CVRegFS 187 lldb_gs_x86_64, // CVRegGS 188 LLDB_INVALID_REGNUM, // CVRegIP 189 LLDB_INVALID_REGNUM, // CVRegFLAGS 190 LLDB_INVALID_REGNUM, // CVRegEIP 191 LLDB_INVALID_REGNUM, // CVRegEFLAGS 192 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 193 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 194 LLDB_INVALID_REGNUM, // CVRegTEMP 195 LLDB_INVALID_REGNUM, // CVRegTEMPH 196 LLDB_INVALID_REGNUM, // CVRegQUOTE 197 LLDB_INVALID_REGNUM, // CVRegPCDR3 198 LLDB_INVALID_REGNUM, // CVRegPCDR4 199 LLDB_INVALID_REGNUM, // CVRegPCDR5 200 LLDB_INVALID_REGNUM, // CVRegPCDR6 201 LLDB_INVALID_REGNUM, // CVRegPCDR7 202 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 203 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 204 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 205 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 206 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 207 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 208 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 209 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 210 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 211 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 212 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 213 LLDB_INVALID_REGNUM, // CVRegCR0 214 LLDB_INVALID_REGNUM, // CVRegCR1 215 LLDB_INVALID_REGNUM, // CVRegCR2 216 LLDB_INVALID_REGNUM, // CVRegCR3 217 LLDB_INVALID_REGNUM, // CVRegCR4 218 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 219 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 220 lldb_dr0_x86_64, // CVRegDR0 221 lldb_dr1_x86_64, // CVRegDR1 222 lldb_dr2_x86_64, // CVRegDR2 223 lldb_dr3_x86_64, // CVRegDR3 224 lldb_dr4_x86_64, // CVRegDR4 225 lldb_dr5_x86_64, // CVRegDR5 226 lldb_dr6_x86_64, // CVRegDR6 227 lldb_dr7_x86_64, // CVRegDR7 228 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 229 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 230 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 231 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 232 LLDB_INVALID_REGNUM, // CVRegGDTR 233 LLDB_INVALID_REGNUM, // CVRegGDTL 234 LLDB_INVALID_REGNUM, // CVRegIDTR 235 LLDB_INVALID_REGNUM, // CVRegIDTL 236 LLDB_INVALID_REGNUM, // CVRegLDTR 237 LLDB_INVALID_REGNUM, // CVRegTR 238 LLDB_INVALID_REGNUM, // CVRegPSEUDO1 239 LLDB_INVALID_REGNUM, // CVRegPSEUDO2 240 LLDB_INVALID_REGNUM, // CVRegPSEUDO3 241 LLDB_INVALID_REGNUM, // CVRegPSEUDO4 242 LLDB_INVALID_REGNUM, // CVRegPSEUDO5 243 LLDB_INVALID_REGNUM, // CVRegPSEUDO6 244 LLDB_INVALID_REGNUM, // CVRegPSEUDO7 245 LLDB_INVALID_REGNUM, // CVRegPSEUDO8 246 LLDB_INVALID_REGNUM, // CVRegPSEUDO9 247 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 248 lldb_st0_x86_64, // CVRegST0 249 lldb_st1_x86_64, // CVRegST1 250 lldb_st2_x86_64, // CVRegST2 251 lldb_st3_x86_64, // CVRegST3 252 lldb_st4_x86_64, // CVRegST4 253 lldb_st5_x86_64, // CVRegST5 254 lldb_st6_x86_64, // CVRegST6 255 lldb_st7_x86_64, // CVRegST7 256 LLDB_INVALID_REGNUM, // CVRegCTRL 257 LLDB_INVALID_REGNUM, // CVRegSTAT 258 LLDB_INVALID_REGNUM, // CVRegTAG 259 LLDB_INVALID_REGNUM, // CVRegFPIP 260 LLDB_INVALID_REGNUM, // CVRegFPCS 261 LLDB_INVALID_REGNUM, // CVRegFPDO 262 LLDB_INVALID_REGNUM, // CVRegFPDS 263 LLDB_INVALID_REGNUM, // CVRegISEM 264 LLDB_INVALID_REGNUM, // CVRegFPEIP 265 LLDB_INVALID_REGNUM, // CVRegFPEDO 266 lldb_mm0_x86_64, // CVRegMM0 267 lldb_mm1_x86_64, // CVRegMM1 268 lldb_mm2_x86_64, // CVRegMM2 269 lldb_mm3_x86_64, // CVRegMM3 270 lldb_mm4_x86_64, // CVRegMM4 271 lldb_mm5_x86_64, // CVRegMM5 272 lldb_mm6_x86_64, // CVRegMM6 273 lldb_mm7_x86_64, // CVRegMM7 274 lldb_xmm0_x86_64, // CVRegXMM0 275 lldb_xmm1_x86_64, // CVRegXMM1 276 lldb_xmm2_x86_64, // CVRegXMM2 277 lldb_xmm3_x86_64, // CVRegXMM3 278 lldb_xmm4_x86_64, // CVRegXMM4 279 lldb_xmm5_x86_64, // CVRegXMM5 280 lldb_xmm6_x86_64, // CVRegXMM6 281 lldb_xmm7_x86_64, // CVRegXMM7 282 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 283 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 284 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 285 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 286 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 287 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 288 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 289 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 290 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 291 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 292 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 293 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 294 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 295 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 296 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 297 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 298 LLDB_INVALID_REGNUM, 299 lldb_mxcsr_x86_64, // CVRegMXCSR 300 LLDB_INVALID_REGNUM, // CVRegEDXEAX 301 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 302 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 303 LLDB_INVALID_REGNUM, 304 LLDB_INVALID_REGNUM, // CVRegEMM0L 305 LLDB_INVALID_REGNUM, // CVRegEMM1L 306 LLDB_INVALID_REGNUM, // CVRegEMM2L 307 LLDB_INVALID_REGNUM, // CVRegEMM3L 308 LLDB_INVALID_REGNUM, // CVRegEMM4L 309 LLDB_INVALID_REGNUM, // CVRegEMM5L 310 LLDB_INVALID_REGNUM, // CVRegEMM6L 311 LLDB_INVALID_REGNUM, // CVRegEMM7L 312 LLDB_INVALID_REGNUM, // CVRegEMM0H 313 LLDB_INVALID_REGNUM, // CVRegEMM1H 314 LLDB_INVALID_REGNUM, // CVRegEMM2H 315 LLDB_INVALID_REGNUM, // CVRegEMM3H 316 LLDB_INVALID_REGNUM, // CVRegEMM4H 317 LLDB_INVALID_REGNUM, // CVRegEMM5H 318 LLDB_INVALID_REGNUM, // CVRegEMM6H 319 LLDB_INVALID_REGNUM, // CVRegEMM7H 320 LLDB_INVALID_REGNUM, // CVRegMM00 321 LLDB_INVALID_REGNUM, // CVRegMM01 322 LLDB_INVALID_REGNUM, // CVRegMM10 323 LLDB_INVALID_REGNUM, // CVRegMM11 324 LLDB_INVALID_REGNUM, // CVRegMM20 325 LLDB_INVALID_REGNUM, // CVRegMM21 326 LLDB_INVALID_REGNUM, // CVRegMM30 327 LLDB_INVALID_REGNUM, // CVRegMM31 328 LLDB_INVALID_REGNUM, // CVRegMM40 329 LLDB_INVALID_REGNUM, // CVRegMM41 330 LLDB_INVALID_REGNUM, // CVRegMM50 331 LLDB_INVALID_REGNUM, // CVRegMM51 332 LLDB_INVALID_REGNUM, // CVRegMM60 333 LLDB_INVALID_REGNUM, // CVRegMM61 334 LLDB_INVALID_REGNUM, // CVRegMM70 335 LLDB_INVALID_REGNUM, // CVRegMM71 336 lldb_xmm8_x86_64, // CVRegXMM8 337 lldb_xmm9_x86_64, // CVRegXMM9 338 lldb_xmm10_x86_64, // CVRegXMM10 339 lldb_xmm11_x86_64, // CVRegXMM11 340 lldb_xmm12_x86_64, // CVRegXMM12 341 lldb_xmm13_x86_64, // CVRegXMM13 342 lldb_xmm14_x86_64, // CVRegXMM14 343 lldb_xmm15_x86_64, // CVRegXMM15 344 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 345 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 346 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 347 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 348 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 349 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 350 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 351 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 352 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 353 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 354 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 355 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 356 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 357 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 358 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 359 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 360 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 361 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 362 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 363 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 364 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 365 LLDB_INVALID_REGNUM, 366 lldb_sil_x86_64, // CVRegSIL 367 lldb_dil_x86_64, // CVRegDIL 368 lldb_bpl_x86_64, // CVRegBPL 369 lldb_spl_x86_64, // CVRegSPL 370 lldb_rax_x86_64, // CVRegRAX 371 lldb_rbx_x86_64, // CVRegRBX 372 lldb_rcx_x86_64, // CVRegRCX 373 lldb_rdx_x86_64, // CVRegRDX 374 lldb_rsi_x86_64, // CVRegRSI 375 lldb_rdi_x86_64, // CVRegRDI 376 lldb_rbp_x86_64, // CVRegRBP 377 lldb_rsp_x86_64, // CVRegRSP 378 lldb_r8_x86_64, // CVRegR8 379 lldb_r9_x86_64, // CVRegR9 380 lldb_r10_x86_64, // CVRegR10 381 lldb_r11_x86_64, // CVRegR11 382 lldb_r12_x86_64, // CVRegR12 383 lldb_r13_x86_64, // CVRegR13 384 lldb_r14_x86_64, // CVRegR14 385 lldb_r15_x86_64, // CVRegR15 386 lldb_r8l_x86_64, // CVRegR8B 387 lldb_r9l_x86_64, // CVRegR9B 388 lldb_r10l_x86_64, // CVRegR10B 389 lldb_r11l_x86_64, // CVRegR11B 390 lldb_r12l_x86_64, // CVRegR12B 391 lldb_r13l_x86_64, // CVRegR13B 392 lldb_r14l_x86_64, // CVRegR14B 393 lldb_r15l_x86_64, // CVRegR15B 394 lldb_r8w_x86_64, // CVRegR8W 395 lldb_r9w_x86_64, // CVRegR9W 396 lldb_r10w_x86_64, // CVRegR10W 397 lldb_r11w_x86_64, // CVRegR11W 398 lldb_r12w_x86_64, // CVRegR12W 399 lldb_r13w_x86_64, // CVRegR13W 400 lldb_r14w_x86_64, // CVRegR14W 401 lldb_r15w_x86_64, // CVRegR15W 402 lldb_r8d_x86_64, // CVRegR8D 403 lldb_r9d_x86_64, // CVRegR9D 404 lldb_r10d_x86_64, // CVRegR10D 405 lldb_r11d_x86_64, // CVRegR11D 406 lldb_r12d_x86_64, // CVRegR12D 407 lldb_r13d_x86_64, // CVRegR13D 408 lldb_r14d_x86_64, // CVRegR14D 409 lldb_r15d_x86_64, // CVRegR15D 410 lldb_ymm0_x86_64, // CVRegAMD64_YMM0 411 lldb_ymm1_x86_64, // CVRegAMD64_YMM1 412 lldb_ymm2_x86_64, // CVRegAMD64_YMM2 413 lldb_ymm3_x86_64, // CVRegAMD64_YMM3 414 lldb_ymm4_x86_64, // CVRegAMD64_YMM4 415 lldb_ymm5_x86_64, // CVRegAMD64_YMM5 416 lldb_ymm6_x86_64, // CVRegAMD64_YMM6 417 lldb_ymm7_x86_64, // CVRegAMD64_YMM7 418 lldb_ymm8_x86_64, // CVRegAMD64_YMM8 419 lldb_ymm9_x86_64, // CVRegAMD64_YMM9 420 lldb_ymm10_x86_64, // CVRegAMD64_YMM10 421 lldb_ymm11_x86_64, // CVRegAMD64_YMM11 422 lldb_ymm12_x86_64, // CVRegAMD64_YMM12 423 lldb_ymm13_x86_64, // CVRegAMD64_YMM13 424 lldb_ymm14_x86_64, // CVRegAMD64_YMM14 425 lldb_ymm15_x86_64, // CVRegAMD64_YMM15 426 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 427 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 428 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 429 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 430 lldb_bnd0_x86_64, // CVRegBND0 431 lldb_bnd1_x86_64, // CVRegBND1 432 lldb_bnd2_x86_64 // CVRegBND2 433 }; 434 435 uint32_t GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type, 436 llvm::codeview::RegisterId register_id) { 437 switch (arch_type) { 438 case llvm::Triple::x86: 439 if (static_cast<uint16_t>(register_id) < 440 sizeof(g_code_view_to_lldb_registers_x86) / 441 sizeof(g_code_view_to_lldb_registers_x86[0])) 442 return g_code_view_to_lldb_registers_x86[static_cast<uint16_t>( 443 register_id)]; 444 445 switch (register_id) { 446 case llvm::codeview::RegisterId::CVRegMXCSR: 447 return lldb_mxcsr_i386; 448 case llvm::codeview::RegisterId::CVRegBND0: 449 return lldb_bnd0_i386; 450 case llvm::codeview::RegisterId::CVRegBND1: 451 return lldb_bnd1_i386; 452 case llvm::codeview::RegisterId::CVRegBND2: 453 return lldb_bnd2_i386; 454 default: 455 return LLDB_INVALID_REGNUM; 456 } 457 case llvm::Triple::x86_64: 458 if (static_cast<uint16_t>(register_id) < 459 sizeof(g_code_view_to_lldb_registers_x86_64) / 460 sizeof(g_code_view_to_lldb_registers_x86_64[0])) 461 return g_code_view_to_lldb_registers_x86_64[static_cast<uint16_t>( 462 register_id)]; 463 464 return LLDB_INVALID_REGNUM; 465 default: 466 return LLDB_INVALID_REGNUM; 467 } 468 } 469 470 uint32_t GetGenericRegisterNumber(llvm::codeview::RegisterId register_id) { 471 if (register_id == llvm::codeview::RegisterId::CVRegVFRAME) 472 return LLDB_REGNUM_GENERIC_FP; 473 474 return LLDB_INVALID_REGNUM; 475 } 476 477 uint32_t GetRegisterNumber(llvm::Triple::ArchType arch_type, 478 llvm::codeview::RegisterId register_id, 479 RegisterKind ®ister_kind) { 480 register_kind = eRegisterKindLLDB; 481 uint32_t reg_num = GetLLDBRegisterNumber(arch_type, register_id); 482 if (reg_num != LLDB_INVALID_REGNUM) 483 return reg_num; 484 485 register_kind = eRegisterKindGeneric; 486 return GetGenericRegisterNumber(register_id); 487 } 488 } // namespace 489 490 DWARFExpression ConvertPDBLocationToDWARFExpression(ModuleSP module, 491 const PDBSymbolData &symbol, 492 bool &is_constant) { 493 is_constant = true; 494 495 if (!module) 496 return DWARFExpression(nullptr); 497 498 const ArchSpec &architecture = module->GetArchitecture(); 499 llvm::Triple::ArchType arch_type = architecture.GetMachine(); 500 ByteOrder byte_order = architecture.GetByteOrder(); 501 uint32_t address_size = architecture.GetAddressByteSize(); 502 uint32_t byte_size = architecture.GetDataByteSize(); 503 if (byte_order == eByteOrderInvalid || address_size == 0) 504 return DWARFExpression(nullptr); 505 506 RegisterKind register_kind = eRegisterKindDWARF; 507 StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order); 508 switch (symbol.getLocationType()) { 509 case PDB_LocType::Static: 510 case PDB_LocType::TLS: { 511 stream.PutHex8(DW_OP_addr); 512 513 SectionList *section_list = module->GetSectionList(); 514 if (!section_list) 515 return DWARFExpression(nullptr); 516 517 uint32_t section_idx = symbol.getAddressSection() - 1; 518 if (section_idx >= section_list->GetSize()) 519 return DWARFExpression(nullptr); 520 521 auto section = section_list->GetSectionAtIndex(section_idx); 522 if (!section) 523 return DWARFExpression(nullptr); 524 525 uint32_t offset = symbol.getAddressOffset(); 526 stream.PutMaxHex64(section->GetFileAddress() + offset, address_size, 527 byte_order); 528 529 is_constant = false; 530 531 break; 532 } 533 case PDB_LocType::RegRel: { 534 uint32_t reg_num = 535 GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind); 536 if (reg_num == LLDB_INVALID_REGNUM) 537 return DWARFExpression(nullptr); 538 539 if (reg_num > 31) { 540 stream.PutHex8(DW_OP_bregx); 541 stream.PutULEB128(reg_num); 542 } else 543 stream.PutHex8(DW_OP_breg0 + reg_num); 544 545 int32_t offset = symbol.getOffset(); 546 stream.PutSLEB128(offset); 547 548 is_constant = false; 549 550 break; 551 } 552 case PDB_LocType::Enregistered: { 553 uint32_t reg_num = 554 GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind); 555 if (reg_num == LLDB_INVALID_REGNUM) 556 return DWARFExpression(nullptr); 557 558 if (reg_num > 31) { 559 stream.PutHex8(DW_OP_regx); 560 stream.PutULEB128(reg_num); 561 } else 562 stream.PutHex8(DW_OP_reg0 + reg_num); 563 564 is_constant = false; 565 566 break; 567 } 568 case PDB_LocType::Constant: { 569 Variant value = symbol.getValue(); 570 stream.PutRawBytes(&value.Value, sizeof(value.Value), 571 endian::InlHostByteOrder()); 572 break; 573 } 574 default: 575 return DWARFExpression(nullptr); 576 } 577 578 DataBufferSP buffer = 579 std::make_shared<DataBufferHeap>(stream.GetData(), stream.GetSize()); 580 DataExtractor extractor(buffer, byte_order, address_size, byte_size); 581 DWARFExpression result(module, extractor, nullptr, 0, buffer->GetByteSize()); 582 result.SetRegisterKind(register_kind); 583 584 return result; 585 } 586