1 //===-- PDBLocationToDWARFExpression.cpp ------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "PDBLocationToDWARFExpression.h" 10 11 #include "lldb/Core/Section.h" 12 #include "lldb/Core/StreamBuffer.h" 13 #include "lldb/Core/dwarf.h" 14 #include "lldb/Expression/DWARFExpression.h" 15 #include "lldb/Utility/DataBufferHeap.h" 16 17 #include "llvm/DebugInfo/CodeView/CodeView.h" 18 #include "llvm/DebugInfo/PDB/PDBSymbolData.h" 19 20 #include "Plugins/Process/Utility/lldb-x86-register-enums.h" 21 22 using namespace lldb; 23 using namespace lldb_private; 24 using namespace llvm::pdb; 25 26 namespace { 27 const uint32_t g_code_view_to_lldb_registers_x86[] = { 28 LLDB_INVALID_REGNUM, // NONE 29 lldb_al_i386, // AL 30 lldb_cl_i386, // CL 31 lldb_dl_i386, // DL 32 lldb_bl_i386, // BL 33 lldb_ah_i386, // AH 34 lldb_ch_i386, // CH 35 lldb_dh_i386, // DH 36 lldb_bh_i386, // BH 37 lldb_ax_i386, // AX 38 lldb_cx_i386, // CX 39 lldb_dx_i386, // DX 40 lldb_bx_i386, // BX 41 lldb_sp_i386, // SP 42 lldb_bp_i386, // BP 43 lldb_si_i386, // SI 44 lldb_di_i386, // DI 45 lldb_eax_i386, // EAX 46 lldb_ecx_i386, // ECX 47 lldb_edx_i386, // EDX 48 lldb_ebx_i386, // EBX 49 lldb_esp_i386, // ESP 50 lldb_ebp_i386, // EBP 51 lldb_esi_i386, // ESI 52 lldb_edi_i386, // EDI 53 lldb_es_i386, // ES 54 lldb_cs_i386, // CS 55 lldb_ss_i386, // SS 56 lldb_ds_i386, // DS 57 lldb_fs_i386, // FS 58 lldb_gs_i386, // GS 59 LLDB_INVALID_REGNUM, // IP 60 LLDB_INVALID_REGNUM, // FLAGS 61 lldb_eip_i386, // EIP 62 lldb_eflags_i386, // EFLAGS 63 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 64 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 65 LLDB_INVALID_REGNUM, // TEMP 66 LLDB_INVALID_REGNUM, // TEMPH 67 LLDB_INVALID_REGNUM, // QUOTE 68 LLDB_INVALID_REGNUM, // PCDR3 69 LLDB_INVALID_REGNUM, // PCDR4 70 LLDB_INVALID_REGNUM, // PCDR5 71 LLDB_INVALID_REGNUM, // PCDR6 72 LLDB_INVALID_REGNUM, // PCDR7 73 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 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, 84 LLDB_INVALID_REGNUM, // CR0 85 LLDB_INVALID_REGNUM, // CR1 86 LLDB_INVALID_REGNUM, // CR2 87 LLDB_INVALID_REGNUM, // CR3 88 LLDB_INVALID_REGNUM, // CR4 89 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 90 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 91 lldb_dr0_i386, // DR0 92 lldb_dr1_i386, // DR1 93 lldb_dr2_i386, // DR2 94 lldb_dr3_i386, // DR3 95 lldb_dr4_i386, // DR4 96 lldb_dr5_i386, // DR5 97 lldb_dr6_i386, // DR6 98 lldb_dr7_i386, // DR7 99 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 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, // GDTR 104 LLDB_INVALID_REGNUM, // GDTL 105 LLDB_INVALID_REGNUM, // IDTR 106 LLDB_INVALID_REGNUM, // IDTL 107 LLDB_INVALID_REGNUM, // LDTR 108 LLDB_INVALID_REGNUM, // TR 109 LLDB_INVALID_REGNUM, // PSEUDO1 110 LLDB_INVALID_REGNUM, // PSEUDO2 111 LLDB_INVALID_REGNUM, // PSEUDO3 112 LLDB_INVALID_REGNUM, // PSEUDO4 113 LLDB_INVALID_REGNUM, // PSEUDO5 114 LLDB_INVALID_REGNUM, // PSEUDO6 115 LLDB_INVALID_REGNUM, // PSEUDO7 116 LLDB_INVALID_REGNUM, // PSEUDO8 117 LLDB_INVALID_REGNUM, // PSEUDO9 118 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 119 lldb_st0_i386, // ST0 120 lldb_st1_i386, // ST1 121 lldb_st2_i386, // ST2 122 lldb_st3_i386, // ST3 123 lldb_st4_i386, // ST4 124 lldb_st5_i386, // ST5 125 lldb_st6_i386, // ST6 126 lldb_st7_i386, // ST7 127 LLDB_INVALID_REGNUM, // CTRL 128 LLDB_INVALID_REGNUM, // STAT 129 LLDB_INVALID_REGNUM, // TAG 130 LLDB_INVALID_REGNUM, // FPIP 131 LLDB_INVALID_REGNUM, // FPCS 132 LLDB_INVALID_REGNUM, // FPDO 133 LLDB_INVALID_REGNUM, // FPDS 134 LLDB_INVALID_REGNUM, // ISEM 135 LLDB_INVALID_REGNUM, // FPEIP 136 LLDB_INVALID_REGNUM, // FPEDO 137 lldb_mm0_i386, // MM0 138 lldb_mm1_i386, // MM1 139 lldb_mm2_i386, // MM2 140 lldb_mm3_i386, // MM3 141 lldb_mm4_i386, // MM4 142 lldb_mm5_i386, // MM5 143 lldb_mm6_i386, // MM6 144 lldb_mm7_i386, // MM7 145 lldb_xmm0_i386, // XMM0 146 lldb_xmm1_i386, // XMM1 147 lldb_xmm2_i386, // XMM2 148 lldb_xmm3_i386, // XMM3 149 lldb_xmm4_i386, // XMM4 150 lldb_xmm5_i386, // XMM5 151 lldb_xmm6_i386, // XMM6 152 lldb_xmm7_i386 // XMM7 153 }; 154 155 const uint32_t g_code_view_to_lldb_registers_x86_64[] = { 156 LLDB_INVALID_REGNUM, // NONE 157 lldb_al_x86_64, // AL 158 lldb_cl_x86_64, // CL 159 lldb_dl_x86_64, // DL 160 lldb_bl_x86_64, // BL 161 lldb_ah_x86_64, // AH 162 lldb_ch_x86_64, // CH 163 lldb_dh_x86_64, // DH 164 lldb_bh_x86_64, // BH 165 lldb_ax_x86_64, // AX 166 lldb_cx_x86_64, // CX 167 lldb_dx_x86_64, // DX 168 lldb_bx_x86_64, // BX 169 lldb_sp_x86_64, // SP 170 lldb_bp_x86_64, // BP 171 lldb_si_x86_64, // SI 172 lldb_di_x86_64, // DI 173 lldb_eax_x86_64, // EAX 174 lldb_ecx_x86_64, // ECX 175 lldb_edx_x86_64, // EDX 176 lldb_ebx_x86_64, // EBX 177 lldb_esp_x86_64, // ESP 178 lldb_ebp_x86_64, // EBP 179 lldb_esi_x86_64, // ESI 180 lldb_edi_x86_64, // EDI 181 lldb_es_x86_64, // ES 182 lldb_cs_x86_64, // CS 183 lldb_ss_x86_64, // SS 184 lldb_ds_x86_64, // DS 185 lldb_fs_x86_64, // FS 186 lldb_gs_x86_64, // GS 187 LLDB_INVALID_REGNUM, // IP 188 LLDB_INVALID_REGNUM, // FLAGS 189 LLDB_INVALID_REGNUM, // EIP 190 LLDB_INVALID_REGNUM, // EFLAGS 191 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 192 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 193 LLDB_INVALID_REGNUM, // TEMP 194 LLDB_INVALID_REGNUM, // TEMPH 195 LLDB_INVALID_REGNUM, // QUOTE 196 LLDB_INVALID_REGNUM, // PCDR3 197 LLDB_INVALID_REGNUM, // PCDR4 198 LLDB_INVALID_REGNUM, // PCDR5 199 LLDB_INVALID_REGNUM, // PCDR6 200 LLDB_INVALID_REGNUM, // PCDR7 201 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 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, 212 LLDB_INVALID_REGNUM, // CR0 213 LLDB_INVALID_REGNUM, // CR1 214 LLDB_INVALID_REGNUM, // CR2 215 LLDB_INVALID_REGNUM, // CR3 216 LLDB_INVALID_REGNUM, // CR4 217 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 218 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 219 lldb_dr0_x86_64, // DR0 220 lldb_dr1_x86_64, // DR1 221 lldb_dr2_x86_64, // DR2 222 lldb_dr3_x86_64, // DR3 223 lldb_dr4_x86_64, // DR4 224 lldb_dr5_x86_64, // DR5 225 lldb_dr6_x86_64, // DR6 226 lldb_dr7_x86_64, // DR7 227 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 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, // GDTR 232 LLDB_INVALID_REGNUM, // GDTL 233 LLDB_INVALID_REGNUM, // IDTR 234 LLDB_INVALID_REGNUM, // IDTL 235 LLDB_INVALID_REGNUM, // LDTR 236 LLDB_INVALID_REGNUM, // TR 237 LLDB_INVALID_REGNUM, // PSEUDO1 238 LLDB_INVALID_REGNUM, // PSEUDO2 239 LLDB_INVALID_REGNUM, // PSEUDO3 240 LLDB_INVALID_REGNUM, // PSEUDO4 241 LLDB_INVALID_REGNUM, // PSEUDO5 242 LLDB_INVALID_REGNUM, // PSEUDO6 243 LLDB_INVALID_REGNUM, // PSEUDO7 244 LLDB_INVALID_REGNUM, // PSEUDO8 245 LLDB_INVALID_REGNUM, // PSEUDO9 246 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 247 lldb_st0_x86_64, // ST0 248 lldb_st1_x86_64, // ST1 249 lldb_st2_x86_64, // ST2 250 lldb_st3_x86_64, // ST3 251 lldb_st4_x86_64, // ST4 252 lldb_st5_x86_64, // ST5 253 lldb_st6_x86_64, // ST6 254 lldb_st7_x86_64, // ST7 255 LLDB_INVALID_REGNUM, // CTRL 256 LLDB_INVALID_REGNUM, // STAT 257 LLDB_INVALID_REGNUM, // TAG 258 LLDB_INVALID_REGNUM, // FPIP 259 LLDB_INVALID_REGNUM, // FPCS 260 LLDB_INVALID_REGNUM, // FPDO 261 LLDB_INVALID_REGNUM, // FPDS 262 LLDB_INVALID_REGNUM, // ISEM 263 LLDB_INVALID_REGNUM, // FPEIP 264 LLDB_INVALID_REGNUM, // FPEDO 265 lldb_mm0_x86_64, // MM0 266 lldb_mm1_x86_64, // MM1 267 lldb_mm2_x86_64, // MM2 268 lldb_mm3_x86_64, // MM3 269 lldb_mm4_x86_64, // MM4 270 lldb_mm5_x86_64, // MM5 271 lldb_mm6_x86_64, // MM6 272 lldb_mm7_x86_64, // MM7 273 lldb_xmm0_x86_64, // XMM0 274 lldb_xmm1_x86_64, // XMM1 275 lldb_xmm2_x86_64, // XMM2 276 lldb_xmm3_x86_64, // XMM3 277 lldb_xmm4_x86_64, // XMM4 278 lldb_xmm5_x86_64, // XMM5 279 lldb_xmm6_x86_64, // XMM6 280 lldb_xmm7_x86_64, // XMM7 281 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 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, 298 lldb_mxcsr_x86_64, // MXCSR 299 LLDB_INVALID_REGNUM, // EDXEAX 300 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 301 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 302 LLDB_INVALID_REGNUM, 303 LLDB_INVALID_REGNUM, // EMM0L 304 LLDB_INVALID_REGNUM, // EMM1L 305 LLDB_INVALID_REGNUM, // EMM2L 306 LLDB_INVALID_REGNUM, // EMM3L 307 LLDB_INVALID_REGNUM, // EMM4L 308 LLDB_INVALID_REGNUM, // EMM5L 309 LLDB_INVALID_REGNUM, // EMM6L 310 LLDB_INVALID_REGNUM, // EMM7L 311 LLDB_INVALID_REGNUM, // EMM0H 312 LLDB_INVALID_REGNUM, // EMM1H 313 LLDB_INVALID_REGNUM, // EMM2H 314 LLDB_INVALID_REGNUM, // EMM3H 315 LLDB_INVALID_REGNUM, // EMM4H 316 LLDB_INVALID_REGNUM, // EMM5H 317 LLDB_INVALID_REGNUM, // EMM6H 318 LLDB_INVALID_REGNUM, // EMM7H 319 LLDB_INVALID_REGNUM, // MM00 320 LLDB_INVALID_REGNUM, // MM01 321 LLDB_INVALID_REGNUM, // MM10 322 LLDB_INVALID_REGNUM, // MM11 323 LLDB_INVALID_REGNUM, // MM20 324 LLDB_INVALID_REGNUM, // MM21 325 LLDB_INVALID_REGNUM, // MM30 326 LLDB_INVALID_REGNUM, // MM31 327 LLDB_INVALID_REGNUM, // MM40 328 LLDB_INVALID_REGNUM, // MM41 329 LLDB_INVALID_REGNUM, // MM50 330 LLDB_INVALID_REGNUM, // MM51 331 LLDB_INVALID_REGNUM, // MM60 332 LLDB_INVALID_REGNUM, // MM61 333 LLDB_INVALID_REGNUM, // MM70 334 LLDB_INVALID_REGNUM, // MM71 335 lldb_xmm8_x86_64, // XMM8 336 lldb_xmm9_x86_64, // XMM9 337 lldb_xmm10_x86_64, // XMM10 338 lldb_xmm11_x86_64, // XMM11 339 lldb_xmm12_x86_64, // XMM12 340 lldb_xmm13_x86_64, // XMM13 341 lldb_xmm14_x86_64, // XMM14 342 lldb_xmm15_x86_64, // XMM15 343 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 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, 365 lldb_sil_x86_64, // SIL 366 lldb_dil_x86_64, // DIL 367 lldb_bpl_x86_64, // BPL 368 lldb_spl_x86_64, // SPL 369 lldb_rax_x86_64, // RAX 370 lldb_rbx_x86_64, // RBX 371 lldb_rcx_x86_64, // RCX 372 lldb_rdx_x86_64, // RDX 373 lldb_rsi_x86_64, // RSI 374 lldb_rdi_x86_64, // RDI 375 lldb_rbp_x86_64, // RBP 376 lldb_rsp_x86_64, // RSP 377 lldb_r8_x86_64, // R8 378 lldb_r9_x86_64, // R9 379 lldb_r10_x86_64, // R10 380 lldb_r11_x86_64, // R11 381 lldb_r12_x86_64, // R12 382 lldb_r13_x86_64, // R13 383 lldb_r14_x86_64, // R14 384 lldb_r15_x86_64, // R15 385 lldb_r8l_x86_64, // R8B 386 lldb_r9l_x86_64, // R9B 387 lldb_r10l_x86_64, // R10B 388 lldb_r11l_x86_64, // R11B 389 lldb_r12l_x86_64, // R12B 390 lldb_r13l_x86_64, // R13B 391 lldb_r14l_x86_64, // R14B 392 lldb_r15l_x86_64, // R15B 393 lldb_r8w_x86_64, // R8W 394 lldb_r9w_x86_64, // R9W 395 lldb_r10w_x86_64, // R10W 396 lldb_r11w_x86_64, // R11W 397 lldb_r12w_x86_64, // R12W 398 lldb_r13w_x86_64, // R13W 399 lldb_r14w_x86_64, // R14W 400 lldb_r15w_x86_64, // R15W 401 lldb_r8d_x86_64, // R8D 402 lldb_r9d_x86_64, // R9D 403 lldb_r10d_x86_64, // R10D 404 lldb_r11d_x86_64, // R11D 405 lldb_r12d_x86_64, // R12D 406 lldb_r13d_x86_64, // R13D 407 lldb_r14d_x86_64, // R14D 408 lldb_r15d_x86_64, // R15D 409 lldb_ymm0_x86_64, // AMD64_YMM0 410 lldb_ymm1_x86_64, // AMD64_YMM1 411 lldb_ymm2_x86_64, // AMD64_YMM2 412 lldb_ymm3_x86_64, // AMD64_YMM3 413 lldb_ymm4_x86_64, // AMD64_YMM4 414 lldb_ymm5_x86_64, // AMD64_YMM5 415 lldb_ymm6_x86_64, // AMD64_YMM6 416 lldb_ymm7_x86_64, // AMD64_YMM7 417 lldb_ymm8_x86_64, // AMD64_YMM8 418 lldb_ymm9_x86_64, // AMD64_YMM9 419 lldb_ymm10_x86_64, // AMD64_YMM10 420 lldb_ymm11_x86_64, // AMD64_YMM11 421 lldb_ymm12_x86_64, // AMD64_YMM12 422 lldb_ymm13_x86_64, // AMD64_YMM13 423 lldb_ymm14_x86_64, // AMD64_YMM14 424 lldb_ymm15_x86_64, // AMD64_YMM15 425 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 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_bnd0_x86_64, // BND0 430 lldb_bnd1_x86_64, // BND1 431 lldb_bnd2_x86_64 // BND2 432 }; 433 434 uint32_t GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type, 435 llvm::codeview::RegisterId register_id) { 436 switch (arch_type) { 437 case llvm::Triple::x86: 438 if (static_cast<uint16_t>(register_id) < 439 sizeof(g_code_view_to_lldb_registers_x86) / 440 sizeof(g_code_view_to_lldb_registers_x86[0])) 441 return g_code_view_to_lldb_registers_x86[static_cast<uint16_t>( 442 register_id)]; 443 444 switch (register_id) { 445 case llvm::codeview::RegisterId::MXCSR: 446 return lldb_mxcsr_i386; 447 case llvm::codeview::RegisterId::BND0: 448 return lldb_bnd0_i386; 449 case llvm::codeview::RegisterId::BND1: 450 return lldb_bnd1_i386; 451 case llvm::codeview::RegisterId::BND2: 452 return lldb_bnd2_i386; 453 default: 454 return LLDB_INVALID_REGNUM; 455 } 456 case llvm::Triple::x86_64: 457 if (static_cast<uint16_t>(register_id) < 458 sizeof(g_code_view_to_lldb_registers_x86_64) / 459 sizeof(g_code_view_to_lldb_registers_x86_64[0])) 460 return g_code_view_to_lldb_registers_x86_64[static_cast<uint16_t>( 461 register_id)]; 462 463 return LLDB_INVALID_REGNUM; 464 default: 465 return LLDB_INVALID_REGNUM; 466 } 467 } 468 469 uint32_t GetGenericRegisterNumber(llvm::codeview::RegisterId register_id) { 470 if (register_id == llvm::codeview::RegisterId::VFRAME) 471 return LLDB_REGNUM_GENERIC_FP; 472 473 return LLDB_INVALID_REGNUM; 474 } 475 476 uint32_t GetRegisterNumber(llvm::Triple::ArchType arch_type, 477 llvm::codeview::RegisterId register_id, 478 RegisterKind ®ister_kind) { 479 register_kind = eRegisterKindLLDB; 480 uint32_t reg_num = GetLLDBRegisterNumber(arch_type, register_id); 481 if (reg_num != LLDB_INVALID_REGNUM) 482 return reg_num; 483 484 register_kind = eRegisterKindGeneric; 485 return GetGenericRegisterNumber(register_id); 486 } 487 } // namespace 488 489 DWARFExpression ConvertPDBLocationToDWARFExpression(ModuleSP module, 490 const PDBSymbolData &symbol, 491 bool &is_constant) { 492 is_constant = true; 493 494 if (!module) 495 return DWARFExpression(nullptr); 496 497 const ArchSpec &architecture = module->GetArchitecture(); 498 llvm::Triple::ArchType arch_type = architecture.GetMachine(); 499 ByteOrder byte_order = architecture.GetByteOrder(); 500 uint32_t address_size = architecture.GetAddressByteSize(); 501 uint32_t byte_size = architecture.GetDataByteSize(); 502 if (byte_order == eByteOrderInvalid || address_size == 0) 503 return DWARFExpression(nullptr); 504 505 RegisterKind register_kind = eRegisterKindDWARF; 506 StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order); 507 switch (symbol.getLocationType()) { 508 case PDB_LocType::Static: 509 case PDB_LocType::TLS: { 510 stream.PutHex8(DW_OP_addr); 511 512 SectionList *section_list = module->GetSectionList(); 513 if (!section_list) 514 return DWARFExpression(nullptr); 515 516 uint32_t section_idx = symbol.getAddressSection() - 1; 517 if (section_idx >= section_list->GetSize()) 518 return DWARFExpression(nullptr); 519 520 auto section = section_list->GetSectionAtIndex(section_idx); 521 if (!section) 522 return DWARFExpression(nullptr); 523 524 uint32_t offset = symbol.getAddressOffset(); 525 stream.PutMaxHex64(section->GetFileAddress() + offset, address_size, 526 byte_order); 527 528 is_constant = false; 529 530 break; 531 } 532 case PDB_LocType::RegRel: { 533 uint32_t reg_num = 534 GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind); 535 if (reg_num == LLDB_INVALID_REGNUM) 536 return DWARFExpression(nullptr); 537 538 if (reg_num > 31) { 539 stream.PutHex8(DW_OP_bregx); 540 stream.PutULEB128(reg_num); 541 } else 542 stream.PutHex8(DW_OP_breg0 + reg_num); 543 544 int32_t offset = symbol.getOffset(); 545 stream.PutSLEB128(offset); 546 547 is_constant = false; 548 549 break; 550 } 551 case PDB_LocType::Enregistered: { 552 uint32_t reg_num = 553 GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind); 554 if (reg_num == LLDB_INVALID_REGNUM) 555 return DWARFExpression(nullptr); 556 557 if (reg_num > 31) { 558 stream.PutHex8(DW_OP_regx); 559 stream.PutULEB128(reg_num); 560 } else 561 stream.PutHex8(DW_OP_reg0 + reg_num); 562 563 is_constant = false; 564 565 break; 566 } 567 case PDB_LocType::Constant: { 568 Variant value = symbol.getValue(); 569 stream.PutRawBytes(&value.Value, sizeof(value.Value), 570 endian::InlHostByteOrder()); 571 break; 572 } 573 default: 574 return DWARFExpression(nullptr); 575 } 576 577 DataBufferSP buffer = 578 std::make_shared<DataBufferHeap>(stream.GetData(), stream.GetSize()); 579 DataExtractor extractor(buffer, byte_order, address_size, byte_size); 580 DWARFExpression result(module, extractor, nullptr, 0, buffer->GetByteSize()); 581 result.SetRegisterKind(register_kind); 582 583 return result; 584 } 585