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, // NONE 30 lldb_al_i386, // AL 31 lldb_cl_i386, // CL 32 lldb_dl_i386, // DL 33 lldb_bl_i386, // BL 34 lldb_ah_i386, // AH 35 lldb_ch_i386, // CH 36 lldb_dh_i386, // DH 37 lldb_bh_i386, // BH 38 lldb_ax_i386, // AX 39 lldb_cx_i386, // CX 40 lldb_dx_i386, // DX 41 lldb_bx_i386, // BX 42 lldb_sp_i386, // SP 43 lldb_bp_i386, // BP 44 lldb_si_i386, // SI 45 lldb_di_i386, // DI 46 lldb_eax_i386, // EAX 47 lldb_ecx_i386, // ECX 48 lldb_edx_i386, // EDX 49 lldb_ebx_i386, // EBX 50 lldb_esp_i386, // ESP 51 lldb_ebp_i386, // EBP 52 lldb_esi_i386, // ESI 53 lldb_edi_i386, // EDI 54 lldb_es_i386, // ES 55 lldb_cs_i386, // CS 56 lldb_ss_i386, // SS 57 lldb_ds_i386, // DS 58 lldb_fs_i386, // FS 59 lldb_gs_i386, // GS 60 LLDB_INVALID_REGNUM, // IP 61 LLDB_INVALID_REGNUM, // FLAGS 62 lldb_eip_i386, // EIP 63 lldb_eflags_i386, // EFLAGS 64 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 65 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 66 LLDB_INVALID_REGNUM, // TEMP 67 LLDB_INVALID_REGNUM, // TEMPH 68 LLDB_INVALID_REGNUM, // QUOTE 69 LLDB_INVALID_REGNUM, // PCDR3 70 LLDB_INVALID_REGNUM, // PCDR4 71 LLDB_INVALID_REGNUM, // PCDR5 72 LLDB_INVALID_REGNUM, // PCDR6 73 LLDB_INVALID_REGNUM, // PCDR7 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, // CR0 86 LLDB_INVALID_REGNUM, // CR1 87 LLDB_INVALID_REGNUM, // CR2 88 LLDB_INVALID_REGNUM, // CR3 89 LLDB_INVALID_REGNUM, // CR4 90 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 91 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 92 lldb_dr0_i386, // DR0 93 lldb_dr1_i386, // DR1 94 lldb_dr2_i386, // DR2 95 lldb_dr3_i386, // DR3 96 lldb_dr4_i386, // DR4 97 lldb_dr5_i386, // DR5 98 lldb_dr6_i386, // DR6 99 lldb_dr7_i386, // DR7 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, // GDTR 105 LLDB_INVALID_REGNUM, // GDTL 106 LLDB_INVALID_REGNUM, // IDTR 107 LLDB_INVALID_REGNUM, // IDTL 108 LLDB_INVALID_REGNUM, // LDTR 109 LLDB_INVALID_REGNUM, // TR 110 LLDB_INVALID_REGNUM, // PSEUDO1 111 LLDB_INVALID_REGNUM, // PSEUDO2 112 LLDB_INVALID_REGNUM, // PSEUDO3 113 LLDB_INVALID_REGNUM, // PSEUDO4 114 LLDB_INVALID_REGNUM, // PSEUDO5 115 LLDB_INVALID_REGNUM, // PSEUDO6 116 LLDB_INVALID_REGNUM, // PSEUDO7 117 LLDB_INVALID_REGNUM, // PSEUDO8 118 LLDB_INVALID_REGNUM, // PSEUDO9 119 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 120 lldb_st0_i386, // ST0 121 lldb_st1_i386, // ST1 122 lldb_st2_i386, // ST2 123 lldb_st3_i386, // ST3 124 lldb_st4_i386, // ST4 125 lldb_st5_i386, // ST5 126 lldb_st6_i386, // ST6 127 lldb_st7_i386, // ST7 128 LLDB_INVALID_REGNUM, // CTRL 129 LLDB_INVALID_REGNUM, // STAT 130 LLDB_INVALID_REGNUM, // TAG 131 LLDB_INVALID_REGNUM, // FPIP 132 LLDB_INVALID_REGNUM, // FPCS 133 LLDB_INVALID_REGNUM, // FPDO 134 LLDB_INVALID_REGNUM, // FPDS 135 LLDB_INVALID_REGNUM, // ISEM 136 LLDB_INVALID_REGNUM, // FPEIP 137 LLDB_INVALID_REGNUM, // FPEDO 138 lldb_mm0_i386, // MM0 139 lldb_mm1_i386, // MM1 140 lldb_mm2_i386, // MM2 141 lldb_mm3_i386, // MM3 142 lldb_mm4_i386, // MM4 143 lldb_mm5_i386, // MM5 144 lldb_mm6_i386, // MM6 145 lldb_mm7_i386, // MM7 146 lldb_xmm0_i386, // XMM0 147 lldb_xmm1_i386, // XMM1 148 lldb_xmm2_i386, // XMM2 149 lldb_xmm3_i386, // XMM3 150 lldb_xmm4_i386, // XMM4 151 lldb_xmm5_i386, // XMM5 152 lldb_xmm6_i386, // XMM6 153 lldb_xmm7_i386 // XMM7 154 }; 155 156 const uint32_t g_code_view_to_lldb_registers_x86_64[] = { 157 LLDB_INVALID_REGNUM, // NONE 158 lldb_al_x86_64, // AL 159 lldb_cl_x86_64, // CL 160 lldb_dl_x86_64, // DL 161 lldb_bl_x86_64, // BL 162 lldb_ah_x86_64, // AH 163 lldb_ch_x86_64, // CH 164 lldb_dh_x86_64, // DH 165 lldb_bh_x86_64, // BH 166 lldb_ax_x86_64, // AX 167 lldb_cx_x86_64, // CX 168 lldb_dx_x86_64, // DX 169 lldb_bx_x86_64, // BX 170 lldb_sp_x86_64, // SP 171 lldb_bp_x86_64, // BP 172 lldb_si_x86_64, // SI 173 lldb_di_x86_64, // DI 174 lldb_eax_x86_64, // EAX 175 lldb_ecx_x86_64, // ECX 176 lldb_edx_x86_64, // EDX 177 lldb_ebx_x86_64, // EBX 178 lldb_esp_x86_64, // ESP 179 lldb_ebp_x86_64, // EBP 180 lldb_esi_x86_64, // ESI 181 lldb_edi_x86_64, // EDI 182 lldb_es_x86_64, // ES 183 lldb_cs_x86_64, // CS 184 lldb_ss_x86_64, // SS 185 lldb_ds_x86_64, // DS 186 lldb_fs_x86_64, // FS 187 lldb_gs_x86_64, // GS 188 LLDB_INVALID_REGNUM, // IP 189 LLDB_INVALID_REGNUM, // FLAGS 190 LLDB_INVALID_REGNUM, // EIP 191 LLDB_INVALID_REGNUM, // EFLAGS 192 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 193 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 194 LLDB_INVALID_REGNUM, // TEMP 195 LLDB_INVALID_REGNUM, // TEMPH 196 LLDB_INVALID_REGNUM, // QUOTE 197 LLDB_INVALID_REGNUM, // PCDR3 198 LLDB_INVALID_REGNUM, // PCDR4 199 LLDB_INVALID_REGNUM, // PCDR5 200 LLDB_INVALID_REGNUM, // PCDR6 201 LLDB_INVALID_REGNUM, // PCDR7 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, // CR0 214 LLDB_INVALID_REGNUM, // CR1 215 LLDB_INVALID_REGNUM, // CR2 216 LLDB_INVALID_REGNUM, // CR3 217 LLDB_INVALID_REGNUM, // CR4 218 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 219 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 220 lldb_dr0_x86_64, // DR0 221 lldb_dr1_x86_64, // DR1 222 lldb_dr2_x86_64, // DR2 223 lldb_dr3_x86_64, // DR3 224 lldb_dr4_x86_64, // DR4 225 lldb_dr5_x86_64, // DR5 226 lldb_dr6_x86_64, // DR6 227 lldb_dr7_x86_64, // DR7 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, // GDTR 233 LLDB_INVALID_REGNUM, // GDTL 234 LLDB_INVALID_REGNUM, // IDTR 235 LLDB_INVALID_REGNUM, // IDTL 236 LLDB_INVALID_REGNUM, // LDTR 237 LLDB_INVALID_REGNUM, // TR 238 LLDB_INVALID_REGNUM, // PSEUDO1 239 LLDB_INVALID_REGNUM, // PSEUDO2 240 LLDB_INVALID_REGNUM, // PSEUDO3 241 LLDB_INVALID_REGNUM, // PSEUDO4 242 LLDB_INVALID_REGNUM, // PSEUDO5 243 LLDB_INVALID_REGNUM, // PSEUDO6 244 LLDB_INVALID_REGNUM, // PSEUDO7 245 LLDB_INVALID_REGNUM, // PSEUDO8 246 LLDB_INVALID_REGNUM, // PSEUDO9 247 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 248 lldb_st0_x86_64, // ST0 249 lldb_st1_x86_64, // ST1 250 lldb_st2_x86_64, // ST2 251 lldb_st3_x86_64, // ST3 252 lldb_st4_x86_64, // ST4 253 lldb_st5_x86_64, // ST5 254 lldb_st6_x86_64, // ST6 255 lldb_st7_x86_64, // ST7 256 LLDB_INVALID_REGNUM, // CTRL 257 LLDB_INVALID_REGNUM, // STAT 258 LLDB_INVALID_REGNUM, // TAG 259 LLDB_INVALID_REGNUM, // FPIP 260 LLDB_INVALID_REGNUM, // FPCS 261 LLDB_INVALID_REGNUM, // FPDO 262 LLDB_INVALID_REGNUM, // FPDS 263 LLDB_INVALID_REGNUM, // ISEM 264 LLDB_INVALID_REGNUM, // FPEIP 265 LLDB_INVALID_REGNUM, // FPEDO 266 lldb_mm0_x86_64, // MM0 267 lldb_mm1_x86_64, // MM1 268 lldb_mm2_x86_64, // MM2 269 lldb_mm3_x86_64, // MM3 270 lldb_mm4_x86_64, // MM4 271 lldb_mm5_x86_64, // MM5 272 lldb_mm6_x86_64, // MM6 273 lldb_mm7_x86_64, // MM7 274 lldb_xmm0_x86_64, // XMM0 275 lldb_xmm1_x86_64, // XMM1 276 lldb_xmm2_x86_64, // XMM2 277 lldb_xmm3_x86_64, // XMM3 278 lldb_xmm4_x86_64, // XMM4 279 lldb_xmm5_x86_64, // XMM5 280 lldb_xmm6_x86_64, // XMM6 281 lldb_xmm7_x86_64, // XMM7 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, // MXCSR 300 LLDB_INVALID_REGNUM, // EDXEAX 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, // EMM0L 305 LLDB_INVALID_REGNUM, // EMM1L 306 LLDB_INVALID_REGNUM, // EMM2L 307 LLDB_INVALID_REGNUM, // EMM3L 308 LLDB_INVALID_REGNUM, // EMM4L 309 LLDB_INVALID_REGNUM, // EMM5L 310 LLDB_INVALID_REGNUM, // EMM6L 311 LLDB_INVALID_REGNUM, // EMM7L 312 LLDB_INVALID_REGNUM, // EMM0H 313 LLDB_INVALID_REGNUM, // EMM1H 314 LLDB_INVALID_REGNUM, // EMM2H 315 LLDB_INVALID_REGNUM, // EMM3H 316 LLDB_INVALID_REGNUM, // EMM4H 317 LLDB_INVALID_REGNUM, // EMM5H 318 LLDB_INVALID_REGNUM, // EMM6H 319 LLDB_INVALID_REGNUM, // EMM7H 320 LLDB_INVALID_REGNUM, // MM00 321 LLDB_INVALID_REGNUM, // MM01 322 LLDB_INVALID_REGNUM, // MM10 323 LLDB_INVALID_REGNUM, // MM11 324 LLDB_INVALID_REGNUM, // MM20 325 LLDB_INVALID_REGNUM, // MM21 326 LLDB_INVALID_REGNUM, // MM30 327 LLDB_INVALID_REGNUM, // MM31 328 LLDB_INVALID_REGNUM, // MM40 329 LLDB_INVALID_REGNUM, // MM41 330 LLDB_INVALID_REGNUM, // MM50 331 LLDB_INVALID_REGNUM, // MM51 332 LLDB_INVALID_REGNUM, // MM60 333 LLDB_INVALID_REGNUM, // MM61 334 LLDB_INVALID_REGNUM, // MM70 335 LLDB_INVALID_REGNUM, // MM71 336 lldb_xmm8_x86_64, // XMM8 337 lldb_xmm9_x86_64, // XMM9 338 lldb_xmm10_x86_64, // XMM10 339 lldb_xmm11_x86_64, // XMM11 340 lldb_xmm12_x86_64, // XMM12 341 lldb_xmm13_x86_64, // XMM13 342 lldb_xmm14_x86_64, // XMM14 343 lldb_xmm15_x86_64, // XMM15 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, // SIL 367 lldb_dil_x86_64, // DIL 368 lldb_bpl_x86_64, // BPL 369 lldb_spl_x86_64, // SPL 370 lldb_rax_x86_64, // RAX 371 lldb_rbx_x86_64, // RBX 372 lldb_rcx_x86_64, // RCX 373 lldb_rdx_x86_64, // RDX 374 lldb_rsi_x86_64, // RSI 375 lldb_rdi_x86_64, // RDI 376 lldb_rbp_x86_64, // RBP 377 lldb_rsp_x86_64, // RSP 378 lldb_r8_x86_64, // R8 379 lldb_r9_x86_64, // R9 380 lldb_r10_x86_64, // R10 381 lldb_r11_x86_64, // R11 382 lldb_r12_x86_64, // R12 383 lldb_r13_x86_64, // R13 384 lldb_r14_x86_64, // R14 385 lldb_r15_x86_64, // R15 386 lldb_r8l_x86_64, // R8B 387 lldb_r9l_x86_64, // R9B 388 lldb_r10l_x86_64, // R10B 389 lldb_r11l_x86_64, // R11B 390 lldb_r12l_x86_64, // R12B 391 lldb_r13l_x86_64, // R13B 392 lldb_r14l_x86_64, // R14B 393 lldb_r15l_x86_64, // R15B 394 lldb_r8w_x86_64, // R8W 395 lldb_r9w_x86_64, // R9W 396 lldb_r10w_x86_64, // R10W 397 lldb_r11w_x86_64, // R11W 398 lldb_r12w_x86_64, // R12W 399 lldb_r13w_x86_64, // R13W 400 lldb_r14w_x86_64, // R14W 401 lldb_r15w_x86_64, // R15W 402 lldb_r8d_x86_64, // R8D 403 lldb_r9d_x86_64, // R9D 404 lldb_r10d_x86_64, // R10D 405 lldb_r11d_x86_64, // R11D 406 lldb_r12d_x86_64, // R12D 407 lldb_r13d_x86_64, // R13D 408 lldb_r14d_x86_64, // R14D 409 lldb_r15d_x86_64, // R15D 410 lldb_ymm0_x86_64, // AMD64_YMM0 411 lldb_ymm1_x86_64, // AMD64_YMM1 412 lldb_ymm2_x86_64, // AMD64_YMM2 413 lldb_ymm3_x86_64, // AMD64_YMM3 414 lldb_ymm4_x86_64, // AMD64_YMM4 415 lldb_ymm5_x86_64, // AMD64_YMM5 416 lldb_ymm6_x86_64, // AMD64_YMM6 417 lldb_ymm7_x86_64, // AMD64_YMM7 418 lldb_ymm8_x86_64, // AMD64_YMM8 419 lldb_ymm9_x86_64, // AMD64_YMM9 420 lldb_ymm10_x86_64, // AMD64_YMM10 421 lldb_ymm11_x86_64, // AMD64_YMM11 422 lldb_ymm12_x86_64, // AMD64_YMM12 423 lldb_ymm13_x86_64, // AMD64_YMM13 424 lldb_ymm14_x86_64, // AMD64_YMM14 425 lldb_ymm15_x86_64, // AMD64_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, // BND0 431 lldb_bnd1_x86_64, // BND1 432 lldb_bnd2_x86_64 // BND2 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::MXCSR: 447 return lldb_mxcsr_i386; 448 case llvm::codeview::RegisterId::BND0: 449 return lldb_bnd0_i386; 450 case llvm::codeview::RegisterId::BND1: 451 return lldb_bnd1_i386; 452 case llvm::codeview::RegisterId::BND2: 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::VFRAME) 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