1 //===-- DWARFLocationExpression.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 "DWARFLocationExpression.h" 11 12 #include "Plugins/Process/Utility/lldb-x86-register-enums.h" 13 #include "lldb/Core/Module.h" 14 #include "lldb/Core/Section.h" 15 #include "lldb/Core/StreamBuffer.h" 16 #include "lldb/Expression/DWARFExpression.h" 17 #include "lldb/Utility/ArchSpec.h" 18 #include "lldb/Utility/DataBufferHeap.h" 19 20 #include "llvm/BinaryFormat/Dwarf.h" 21 #include "llvm/DebugInfo/CodeView/TypeDeserializer.h" 22 #include "llvm/DebugInfo/CodeView/TypeIndex.h" 23 #include "llvm/DebugInfo/PDB/Native/TpiStream.h" 24 #include "llvm/Support/Endian.h" 25 26 #include "PdbUtil.h" 27 28 using namespace lldb; 29 using namespace lldb_private; 30 using namespace lldb_private::npdb; 31 using namespace llvm::codeview; 32 using namespace llvm::pdb; 33 34 static const uint32_t g_code_view_to_lldb_registers_x86[] = { 35 LLDB_INVALID_REGNUM, // NONE 36 lldb_al_i386, // AL 37 lldb_cl_i386, // CL 38 lldb_dl_i386, // DL 39 lldb_bl_i386, // BL 40 lldb_ah_i386, // AH 41 lldb_ch_i386, // CH 42 lldb_dh_i386, // DH 43 lldb_bh_i386, // BH 44 lldb_ax_i386, // AX 45 lldb_cx_i386, // CX 46 lldb_dx_i386, // DX 47 lldb_bx_i386, // BX 48 lldb_sp_i386, // SP 49 lldb_bp_i386, // BP 50 lldb_si_i386, // SI 51 lldb_di_i386, // DI 52 lldb_eax_i386, // EAX 53 lldb_ecx_i386, // ECX 54 lldb_edx_i386, // EDX 55 lldb_ebx_i386, // EBX 56 lldb_esp_i386, // ESP 57 lldb_ebp_i386, // EBP 58 lldb_esi_i386, // ESI 59 lldb_edi_i386, // EDI 60 lldb_es_i386, // ES 61 lldb_cs_i386, // CS 62 lldb_ss_i386, // SS 63 lldb_ds_i386, // DS 64 lldb_fs_i386, // FS 65 lldb_gs_i386, // GS 66 LLDB_INVALID_REGNUM, // IP 67 LLDB_INVALID_REGNUM, // FLAGS 68 lldb_eip_i386, // EIP 69 lldb_eflags_i386, // EFLAGS 70 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 71 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 72 LLDB_INVALID_REGNUM, // TEMP 73 LLDB_INVALID_REGNUM, // TEMPH 74 LLDB_INVALID_REGNUM, // QUOTE 75 LLDB_INVALID_REGNUM, // PCDR3 76 LLDB_INVALID_REGNUM, // PCDR4 77 LLDB_INVALID_REGNUM, // PCDR5 78 LLDB_INVALID_REGNUM, // PCDR6 79 LLDB_INVALID_REGNUM, // PCDR7 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, LLDB_INVALID_REGNUM, 85 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 86 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 87 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 88 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 89 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 90 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 91 LLDB_INVALID_REGNUM, // CR0 92 LLDB_INVALID_REGNUM, // CR1 93 LLDB_INVALID_REGNUM, // CR2 94 LLDB_INVALID_REGNUM, // CR3 95 LLDB_INVALID_REGNUM, // CR4 96 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 97 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 98 lldb_dr0_i386, // DR0 99 lldb_dr1_i386, // DR1 100 lldb_dr2_i386, // DR2 101 lldb_dr3_i386, // DR3 102 lldb_dr4_i386, // DR4 103 lldb_dr5_i386, // DR5 104 lldb_dr6_i386, // DR6 105 lldb_dr7_i386, // DR7 106 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 107 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 108 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 109 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 110 LLDB_INVALID_REGNUM, // GDTR 111 LLDB_INVALID_REGNUM, // GDTL 112 LLDB_INVALID_REGNUM, // IDTR 113 LLDB_INVALID_REGNUM, // IDTL 114 LLDB_INVALID_REGNUM, // LDTR 115 LLDB_INVALID_REGNUM, // TR 116 LLDB_INVALID_REGNUM, // PSEUDO1 117 LLDB_INVALID_REGNUM, // PSEUDO2 118 LLDB_INVALID_REGNUM, // PSEUDO3 119 LLDB_INVALID_REGNUM, // PSEUDO4 120 LLDB_INVALID_REGNUM, // PSEUDO5 121 LLDB_INVALID_REGNUM, // PSEUDO6 122 LLDB_INVALID_REGNUM, // PSEUDO7 123 LLDB_INVALID_REGNUM, // PSEUDO8 124 LLDB_INVALID_REGNUM, // PSEUDO9 125 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 126 lldb_st0_i386, // ST0 127 lldb_st1_i386, // ST1 128 lldb_st2_i386, // ST2 129 lldb_st3_i386, // ST3 130 lldb_st4_i386, // ST4 131 lldb_st5_i386, // ST5 132 lldb_st6_i386, // ST6 133 lldb_st7_i386, // ST7 134 LLDB_INVALID_REGNUM, // CTRL 135 LLDB_INVALID_REGNUM, // STAT 136 LLDB_INVALID_REGNUM, // TAG 137 LLDB_INVALID_REGNUM, // FPIP 138 LLDB_INVALID_REGNUM, // FPCS 139 LLDB_INVALID_REGNUM, // FPDO 140 LLDB_INVALID_REGNUM, // FPDS 141 LLDB_INVALID_REGNUM, // ISEM 142 LLDB_INVALID_REGNUM, // FPEIP 143 LLDB_INVALID_REGNUM, // FPEDO 144 lldb_mm0_i386, // MM0 145 lldb_mm1_i386, // MM1 146 lldb_mm2_i386, // MM2 147 lldb_mm3_i386, // MM3 148 lldb_mm4_i386, // MM4 149 lldb_mm5_i386, // MM5 150 lldb_mm6_i386, // MM6 151 lldb_mm7_i386, // MM7 152 lldb_xmm0_i386, // XMM0 153 lldb_xmm1_i386, // XMM1 154 lldb_xmm2_i386, // XMM2 155 lldb_xmm3_i386, // XMM3 156 lldb_xmm4_i386, // XMM4 157 lldb_xmm5_i386, // XMM5 158 lldb_xmm6_i386, // XMM6 159 lldb_xmm7_i386 // XMM7 160 }; 161 162 static const uint32_t g_code_view_to_lldb_registers_x86_64[] = { 163 LLDB_INVALID_REGNUM, // NONE 164 lldb_al_x86_64, // AL 165 lldb_cl_x86_64, // CL 166 lldb_dl_x86_64, // DL 167 lldb_bl_x86_64, // BL 168 lldb_ah_x86_64, // AH 169 lldb_ch_x86_64, // CH 170 lldb_dh_x86_64, // DH 171 lldb_bh_x86_64, // BH 172 lldb_ax_x86_64, // AX 173 lldb_cx_x86_64, // CX 174 lldb_dx_x86_64, // DX 175 lldb_bx_x86_64, // BX 176 lldb_sp_x86_64, // SP 177 lldb_bp_x86_64, // BP 178 lldb_si_x86_64, // SI 179 lldb_di_x86_64, // DI 180 lldb_eax_x86_64, // EAX 181 lldb_ecx_x86_64, // ECX 182 lldb_edx_x86_64, // EDX 183 lldb_ebx_x86_64, // EBX 184 lldb_esp_x86_64, // ESP 185 lldb_ebp_x86_64, // EBP 186 lldb_esi_x86_64, // ESI 187 lldb_edi_x86_64, // EDI 188 lldb_es_x86_64, // ES 189 lldb_cs_x86_64, // CS 190 lldb_ss_x86_64, // SS 191 lldb_ds_x86_64, // DS 192 lldb_fs_x86_64, // FS 193 lldb_gs_x86_64, // GS 194 LLDB_INVALID_REGNUM, // IP 195 LLDB_INVALID_REGNUM, // FLAGS 196 LLDB_INVALID_REGNUM, // EIP 197 LLDB_INVALID_REGNUM, // EFLAGS 198 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 199 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 200 LLDB_INVALID_REGNUM, // TEMP 201 LLDB_INVALID_REGNUM, // TEMPH 202 LLDB_INVALID_REGNUM, // QUOTE 203 LLDB_INVALID_REGNUM, // PCDR3 204 LLDB_INVALID_REGNUM, // PCDR4 205 LLDB_INVALID_REGNUM, // PCDR5 206 LLDB_INVALID_REGNUM, // PCDR6 207 LLDB_INVALID_REGNUM, // PCDR7 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, LLDB_INVALID_REGNUM, 213 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 214 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 215 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 216 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 217 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 218 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 219 LLDB_INVALID_REGNUM, // CR0 220 LLDB_INVALID_REGNUM, // CR1 221 LLDB_INVALID_REGNUM, // CR2 222 LLDB_INVALID_REGNUM, // CR3 223 LLDB_INVALID_REGNUM, // CR4 224 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 225 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 226 lldb_dr0_x86_64, // DR0 227 lldb_dr1_x86_64, // DR1 228 lldb_dr2_x86_64, // DR2 229 lldb_dr3_x86_64, // DR3 230 lldb_dr4_x86_64, // DR4 231 lldb_dr5_x86_64, // DR5 232 lldb_dr6_x86_64, // DR6 233 lldb_dr7_x86_64, // DR7 234 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 235 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 236 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 237 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 238 LLDB_INVALID_REGNUM, // GDTR 239 LLDB_INVALID_REGNUM, // GDTL 240 LLDB_INVALID_REGNUM, // IDTR 241 LLDB_INVALID_REGNUM, // IDTL 242 LLDB_INVALID_REGNUM, // LDTR 243 LLDB_INVALID_REGNUM, // TR 244 LLDB_INVALID_REGNUM, // PSEUDO1 245 LLDB_INVALID_REGNUM, // PSEUDO2 246 LLDB_INVALID_REGNUM, // PSEUDO3 247 LLDB_INVALID_REGNUM, // PSEUDO4 248 LLDB_INVALID_REGNUM, // PSEUDO5 249 LLDB_INVALID_REGNUM, // PSEUDO6 250 LLDB_INVALID_REGNUM, // PSEUDO7 251 LLDB_INVALID_REGNUM, // PSEUDO8 252 LLDB_INVALID_REGNUM, // PSEUDO9 253 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 254 lldb_st0_x86_64, // ST0 255 lldb_st1_x86_64, // ST1 256 lldb_st2_x86_64, // ST2 257 lldb_st3_x86_64, // ST3 258 lldb_st4_x86_64, // ST4 259 lldb_st5_x86_64, // ST5 260 lldb_st6_x86_64, // ST6 261 lldb_st7_x86_64, // ST7 262 LLDB_INVALID_REGNUM, // CTRL 263 LLDB_INVALID_REGNUM, // STAT 264 LLDB_INVALID_REGNUM, // TAG 265 LLDB_INVALID_REGNUM, // FPIP 266 LLDB_INVALID_REGNUM, // FPCS 267 LLDB_INVALID_REGNUM, // FPDO 268 LLDB_INVALID_REGNUM, // FPDS 269 LLDB_INVALID_REGNUM, // ISEM 270 LLDB_INVALID_REGNUM, // FPEIP 271 LLDB_INVALID_REGNUM, // FPEDO 272 lldb_mm0_x86_64, // MM0 273 lldb_mm1_x86_64, // MM1 274 lldb_mm2_x86_64, // MM2 275 lldb_mm3_x86_64, // MM3 276 lldb_mm4_x86_64, // MM4 277 lldb_mm5_x86_64, // MM5 278 lldb_mm6_x86_64, // MM6 279 lldb_mm7_x86_64, // MM7 280 lldb_xmm0_x86_64, // XMM0 281 lldb_xmm1_x86_64, // XMM1 282 lldb_xmm2_x86_64, // XMM2 283 lldb_xmm3_x86_64, // XMM3 284 lldb_xmm4_x86_64, // XMM4 285 lldb_xmm5_x86_64, // XMM5 286 lldb_xmm6_x86_64, // XMM6 287 lldb_xmm7_x86_64, // XMM7 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, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 299 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 300 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 301 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 302 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 303 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 304 LLDB_INVALID_REGNUM, 305 lldb_mxcsr_x86_64, // MXCSR 306 LLDB_INVALID_REGNUM, // EDXEAX 307 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 308 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 309 LLDB_INVALID_REGNUM, 310 LLDB_INVALID_REGNUM, // EMM0L 311 LLDB_INVALID_REGNUM, // EMM1L 312 LLDB_INVALID_REGNUM, // EMM2L 313 LLDB_INVALID_REGNUM, // EMM3L 314 LLDB_INVALID_REGNUM, // EMM4L 315 LLDB_INVALID_REGNUM, // EMM5L 316 LLDB_INVALID_REGNUM, // EMM6L 317 LLDB_INVALID_REGNUM, // EMM7L 318 LLDB_INVALID_REGNUM, // EMM0H 319 LLDB_INVALID_REGNUM, // EMM1H 320 LLDB_INVALID_REGNUM, // EMM2H 321 LLDB_INVALID_REGNUM, // EMM3H 322 LLDB_INVALID_REGNUM, // EMM4H 323 LLDB_INVALID_REGNUM, // EMM5H 324 LLDB_INVALID_REGNUM, // EMM6H 325 LLDB_INVALID_REGNUM, // EMM7H 326 LLDB_INVALID_REGNUM, // MM00 327 LLDB_INVALID_REGNUM, // MM01 328 LLDB_INVALID_REGNUM, // MM10 329 LLDB_INVALID_REGNUM, // MM11 330 LLDB_INVALID_REGNUM, // MM20 331 LLDB_INVALID_REGNUM, // MM21 332 LLDB_INVALID_REGNUM, // MM30 333 LLDB_INVALID_REGNUM, // MM31 334 LLDB_INVALID_REGNUM, // MM40 335 LLDB_INVALID_REGNUM, // MM41 336 LLDB_INVALID_REGNUM, // MM50 337 LLDB_INVALID_REGNUM, // MM51 338 LLDB_INVALID_REGNUM, // MM60 339 LLDB_INVALID_REGNUM, // MM61 340 LLDB_INVALID_REGNUM, // MM70 341 LLDB_INVALID_REGNUM, // MM71 342 lldb_xmm8_x86_64, // XMM8 343 lldb_xmm9_x86_64, // XMM9 344 lldb_xmm10_x86_64, // XMM10 345 lldb_xmm11_x86_64, // XMM11 346 lldb_xmm12_x86_64, // XMM12 347 lldb_xmm13_x86_64, // XMM13 348 lldb_xmm14_x86_64, // XMM14 349 lldb_xmm15_x86_64, // XMM15 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, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 366 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 367 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 368 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 369 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 370 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 371 LLDB_INVALID_REGNUM, 372 lldb_sil_x86_64, // SIL 373 lldb_dil_x86_64, // DIL 374 lldb_bpl_x86_64, // BPL 375 lldb_spl_x86_64, // SPL 376 lldb_rax_x86_64, // RAX 377 lldb_rbx_x86_64, // RBX 378 lldb_rcx_x86_64, // RCX 379 lldb_rdx_x86_64, // RDX 380 lldb_rsi_x86_64, // RSI 381 lldb_rdi_x86_64, // RDI 382 lldb_rbp_x86_64, // RBP 383 lldb_rsp_x86_64, // RSP 384 lldb_r8_x86_64, // R8 385 lldb_r9_x86_64, // R9 386 lldb_r10_x86_64, // R10 387 lldb_r11_x86_64, // R11 388 lldb_r12_x86_64, // R12 389 lldb_r13_x86_64, // R13 390 lldb_r14_x86_64, // R14 391 lldb_r15_x86_64, // R15 392 lldb_r8l_x86_64, // R8B 393 lldb_r9l_x86_64, // R9B 394 lldb_r10l_x86_64, // R10B 395 lldb_r11l_x86_64, // R11B 396 lldb_r12l_x86_64, // R12B 397 lldb_r13l_x86_64, // R13B 398 lldb_r14l_x86_64, // R14B 399 lldb_r15l_x86_64, // R15B 400 lldb_r8w_x86_64, // R8W 401 lldb_r9w_x86_64, // R9W 402 lldb_r10w_x86_64, // R10W 403 lldb_r11w_x86_64, // R11W 404 lldb_r12w_x86_64, // R12W 405 lldb_r13w_x86_64, // R13W 406 lldb_r14w_x86_64, // R14W 407 lldb_r15w_x86_64, // R15W 408 lldb_r8d_x86_64, // R8D 409 lldb_r9d_x86_64, // R9D 410 lldb_r10d_x86_64, // R10D 411 lldb_r11d_x86_64, // R11D 412 lldb_r12d_x86_64, // R12D 413 lldb_r13d_x86_64, // R13D 414 lldb_r14d_x86_64, // R14D 415 lldb_r15d_x86_64, // R15D 416 lldb_ymm0_x86_64, // AMD64_YMM0 417 lldb_ymm1_x86_64, // AMD64_YMM1 418 lldb_ymm2_x86_64, // AMD64_YMM2 419 lldb_ymm3_x86_64, // AMD64_YMM3 420 lldb_ymm4_x86_64, // AMD64_YMM4 421 lldb_ymm5_x86_64, // AMD64_YMM5 422 lldb_ymm6_x86_64, // AMD64_YMM6 423 lldb_ymm7_x86_64, // AMD64_YMM7 424 lldb_ymm8_x86_64, // AMD64_YMM8 425 lldb_ymm9_x86_64, // AMD64_YMM9 426 lldb_ymm10_x86_64, // AMD64_YMM10 427 lldb_ymm11_x86_64, // AMD64_YMM11 428 lldb_ymm12_x86_64, // AMD64_YMM12 429 lldb_ymm13_x86_64, // AMD64_YMM13 430 lldb_ymm14_x86_64, // AMD64_YMM14 431 lldb_ymm15_x86_64, // AMD64_YMM15 432 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 433 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 434 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 435 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 436 lldb_bnd0_x86_64, // BND0 437 lldb_bnd1_x86_64, // BND1 438 lldb_bnd2_x86_64 // BND2 439 }; 440 441 uint32_t GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type, 442 llvm::codeview::RegisterId register_id) { 443 switch (arch_type) { 444 case llvm::Triple::x86: 445 if (static_cast<uint16_t>(register_id) < 446 sizeof(g_code_view_to_lldb_registers_x86) / 447 sizeof(g_code_view_to_lldb_registers_x86[0])) 448 return g_code_view_to_lldb_registers_x86[static_cast<uint16_t>( 449 register_id)]; 450 451 switch (register_id) { 452 case llvm::codeview::RegisterId::MXCSR: 453 return lldb_mxcsr_i386; 454 case llvm::codeview::RegisterId::BND0: 455 return lldb_bnd0_i386; 456 case llvm::codeview::RegisterId::BND1: 457 return lldb_bnd1_i386; 458 case llvm::codeview::RegisterId::BND2: 459 return lldb_bnd2_i386; 460 default: 461 return LLDB_INVALID_REGNUM; 462 } 463 case llvm::Triple::x86_64: 464 if (static_cast<uint16_t>(register_id) < 465 sizeof(g_code_view_to_lldb_registers_x86_64) / 466 sizeof(g_code_view_to_lldb_registers_x86_64[0])) 467 return g_code_view_to_lldb_registers_x86_64[static_cast<uint16_t>( 468 register_id)]; 469 470 return LLDB_INVALID_REGNUM; 471 default: 472 return LLDB_INVALID_REGNUM; 473 } 474 } 475 476 uint32_t GetGenericRegisterNumber(llvm::codeview::RegisterId register_id) { 477 if (register_id == llvm::codeview::RegisterId::VFRAME) 478 return LLDB_REGNUM_GENERIC_FP; 479 480 return LLDB_INVALID_REGNUM; 481 } 482 483 static uint32_t GetRegisterNumber(llvm::Triple::ArchType arch_type, 484 llvm::codeview::RegisterId register_id, 485 RegisterKind ®ister_kind) { 486 register_kind = eRegisterKindLLDB; 487 uint32_t reg_num = GetLLDBRegisterNumber(arch_type, register_id); 488 if (reg_num != LLDB_INVALID_REGNUM) 489 return reg_num; 490 491 register_kind = eRegisterKindGeneric; 492 return GetGenericRegisterNumber(register_id); 493 } 494 495 static bool IsSimpleTypeSignedInteger(SimpleTypeKind kind) { 496 switch (kind) { 497 case SimpleTypeKind::Int128: 498 case SimpleTypeKind::Int64: 499 case SimpleTypeKind::Int64Quad: 500 case SimpleTypeKind::Int32: 501 case SimpleTypeKind::Int32Long: 502 case SimpleTypeKind::Int16: 503 case SimpleTypeKind::Int16Short: 504 case SimpleTypeKind::Float128: 505 case SimpleTypeKind::Float80: 506 case SimpleTypeKind::Float64: 507 case SimpleTypeKind::Float32: 508 case SimpleTypeKind::Float16: 509 case SimpleTypeKind::NarrowCharacter: 510 case SimpleTypeKind::SignedCharacter: 511 case SimpleTypeKind::SByte: 512 return true; 513 default: 514 return false; 515 } 516 } 517 518 static std::pair<size_t, bool> GetIntegralTypeInfo(TypeIndex ti, 519 TpiStream &tpi) { 520 if (ti.isSimple()) { 521 SimpleTypeKind stk = ti.getSimpleKind(); 522 return {GetTypeSizeForSimpleKind(stk), IsSimpleTypeSignedInteger(stk)}; 523 } 524 525 CVType cvt = tpi.getType(ti); 526 switch (cvt.kind()) { 527 case LF_MODIFIER: { 528 ModifierRecord mfr; 529 llvm::cantFail(TypeDeserializer::deserializeAs<ModifierRecord>(cvt, mfr)); 530 return GetIntegralTypeInfo(mfr.ModifiedType, tpi); 531 } 532 case LF_POINTER: { 533 PointerRecord pr; 534 llvm::cantFail(TypeDeserializer::deserializeAs<PointerRecord>(cvt, pr)); 535 return GetIntegralTypeInfo(pr.ReferentType, tpi); 536 } 537 case LF_ENUM: { 538 EnumRecord er; 539 llvm::cantFail(TypeDeserializer::deserializeAs<EnumRecord>(cvt, er)); 540 return GetIntegralTypeInfo(er.UnderlyingType, tpi); 541 } 542 default: 543 assert(false && "Type is not integral!"); 544 return {0, false}; 545 } 546 } 547 548 template <typename StreamWriter> 549 static DWARFExpression MakeLocationExpressionInternal(lldb::ModuleSP module, 550 StreamWriter &&writer) { 551 const ArchSpec &architecture = module->GetArchitecture(); 552 ByteOrder byte_order = architecture.GetByteOrder(); 553 uint32_t address_size = architecture.GetAddressByteSize(); 554 uint32_t byte_size = architecture.GetDataByteSize(); 555 if (byte_order == eByteOrderInvalid || address_size == 0) 556 return DWARFExpression(nullptr); 557 558 RegisterKind register_kind = eRegisterKindDWARF; 559 StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order); 560 561 if (!writer(stream, register_kind)) 562 return DWARFExpression(nullptr); 563 564 DataBufferSP buffer = 565 std::make_shared<DataBufferHeap>(stream.GetData(), stream.GetSize()); 566 DataExtractor extractor(buffer, byte_order, address_size, byte_size); 567 DWARFExpression result(module, extractor, nullptr, 0, buffer->GetByteSize()); 568 result.SetRegisterKind(register_kind); 569 570 return result; 571 } 572 573 static DWARFExpression MakeRegisterBasedLocationExpressionInternal( 574 llvm::codeview::RegisterId reg, llvm::Optional<int32_t> relative_offset, 575 lldb::ModuleSP module) { 576 return MakeLocationExpressionInternal( 577 module, [&](Stream &stream, RegisterKind ®ister_kind) -> bool { 578 uint32_t reg_num = GetRegisterNumber( 579 module->GetArchitecture().GetMachine(), reg, register_kind); 580 if (reg_num == LLDB_INVALID_REGNUM) 581 return false; 582 583 if (reg_num > 31) { 584 llvm::dwarf::LocationAtom base = relative_offset 585 ? llvm::dwarf::DW_OP_bregx 586 : llvm::dwarf::DW_OP_regx; 587 stream.PutHex8(base); 588 stream.PutULEB128(reg_num); 589 } else { 590 llvm::dwarf::LocationAtom base = relative_offset 591 ? llvm::dwarf::DW_OP_breg0 592 : llvm::dwarf::DW_OP_reg0; 593 stream.PutHex8(base + reg_num); 594 } 595 596 if (relative_offset) 597 stream.PutSLEB128(*relative_offset); 598 599 return true; 600 }); 601 } 602 603 DWARFExpression lldb_private::npdb::MakeEnregisteredLocationExpression( 604 llvm::codeview::RegisterId reg, lldb::ModuleSP module) { 605 return MakeRegisterBasedLocationExpressionInternal(reg, llvm::None, module); 606 } 607 608 DWARFExpression lldb_private::npdb::MakeRegRelLocationExpression( 609 llvm::codeview::RegisterId reg, int32_t offset, lldb::ModuleSP module) { 610 return MakeRegisterBasedLocationExpressionInternal(reg, offset, module); 611 } 612 613 DWARFExpression lldb_private::npdb::MakeGlobalLocationExpression( 614 uint16_t section, uint32_t offset, ModuleSP module) { 615 assert(section > 0); 616 assert(module); 617 618 return MakeLocationExpressionInternal( 619 module, [&](Stream &stream, RegisterKind ®ister_kind) -> bool { 620 stream.PutHex8(llvm::dwarf::DW_OP_addr); 621 622 SectionList *section_list = module->GetSectionList(); 623 assert(section_list); 624 625 // Section indices in PDB are 1-based, but in DWARF they are 0-based, so 626 // we need to subtract 1. 627 uint32_t section_idx = section - 1; 628 if (section_idx >= section_list->GetSize()) 629 return false; 630 631 auto section_ptr = section_list->GetSectionAtIndex(section_idx); 632 if (!section_ptr) 633 return false; 634 635 stream.PutMaxHex64(section_ptr->GetFileAddress() + offset, 636 stream.GetAddressByteSize(), stream.GetByteOrder()); 637 638 return true; 639 }); 640 } 641 642 DWARFExpression lldb_private::npdb::MakeConstantLocationExpression( 643 TypeIndex underlying_ti, TpiStream &tpi, const llvm::APSInt &constant, 644 ModuleSP module) { 645 const ArchSpec &architecture = module->GetArchitecture(); 646 uint32_t address_size = architecture.GetAddressByteSize(); 647 648 size_t size = 0; 649 bool is_signed = false; 650 std::tie(size, is_signed) = GetIntegralTypeInfo(underlying_ti, tpi); 651 652 union { 653 llvm::support::little64_t I; 654 llvm::support::ulittle64_t U; 655 } Value; 656 657 std::shared_ptr<DataBufferHeap> buffer = std::make_shared<DataBufferHeap>(); 658 buffer->SetByteSize(size); 659 660 llvm::ArrayRef<uint8_t> bytes; 661 if (is_signed) { 662 Value.I = constant.getSExtValue(); 663 } else { 664 Value.U = constant.getZExtValue(); 665 } 666 667 bytes = llvm::makeArrayRef(reinterpret_cast<const uint8_t *>(&Value), 8) 668 .take_front(size); 669 buffer->CopyData(bytes.data(), size); 670 DataExtractor extractor(buffer, lldb::eByteOrderLittle, address_size); 671 DWARFExpression result(nullptr, extractor, nullptr, 0, size); 672 return result; 673 } 674