| //===-- PDBLocationToDWARFExpression.cpp ------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "PDBLocationToDWARFExpression.h" |
| |
| #include "lldb/Core/Section.h" |
| #include "lldb/Core/StreamBuffer.h" |
| #include "lldb/Core/dwarf.h" |
| #include "lldb/Expression/DWARFExpression.h" |
| #include "lldb/Utility/DataBufferHeap.h" |
| |
| #include "llvm/DebugInfo/CodeView/CodeView.h" |
| #include "llvm/DebugInfo/PDB/PDBSymbolData.h" |
| |
| #include "Plugins/Process/Utility/lldb-x86-register-enums.h" |
| |
| using namespace lldb; |
| using namespace lldb_private; |
| using namespace llvm::pdb; |
| |
| namespace { |
| const uint32_t g_code_view_to_lldb_registers_x86[] = { |
| LLDB_INVALID_REGNUM, // CVRegNONE |
| lldb_al_i386, // CVRegAL |
| lldb_cl_i386, // CVRegCL |
| lldb_dl_i386, // CVRegDL |
| lldb_bl_i386, // CVRegBL |
| lldb_ah_i386, // CVRegAH |
| lldb_ch_i386, // CVRegCH |
| lldb_dh_i386, // CVRegDH |
| lldb_bh_i386, // CVRegBH |
| lldb_ax_i386, // CVRegAX |
| lldb_cx_i386, // CVRegCX |
| lldb_dx_i386, // CVRegDX |
| lldb_bx_i386, // CVRegBX |
| lldb_sp_i386, // CVRegSP |
| lldb_bp_i386, // CVRegBP |
| lldb_si_i386, // CVRegSI |
| lldb_di_i386, // CVRegDI |
| lldb_eax_i386, // CVRegEAX |
| lldb_ecx_i386, // CVRegECX |
| lldb_edx_i386, // CVRegEDX |
| lldb_ebx_i386, // CVRegEBX |
| lldb_esp_i386, // CVRegESP |
| lldb_ebp_i386, // CVRegEBP |
| lldb_esi_i386, // CVRegESI |
| lldb_edi_i386, // CVRegEDI |
| lldb_es_i386, // CVRegES |
| lldb_cs_i386, // CVRegCS |
| lldb_ss_i386, // CVRegSS |
| lldb_ds_i386, // CVRegDS |
| lldb_fs_i386, // CVRegFS |
| lldb_gs_i386, // CVRegGS |
| LLDB_INVALID_REGNUM, // CVRegIP |
| LLDB_INVALID_REGNUM, // CVRegFLAGS |
| lldb_eip_i386, // CVRegEIP |
| lldb_eflags_i386, // CVRegEFLAGS |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, // CVRegTEMP |
| LLDB_INVALID_REGNUM, // CVRegTEMPH |
| LLDB_INVALID_REGNUM, // CVRegQUOTE |
| LLDB_INVALID_REGNUM, // CVRegPCDR3 |
| LLDB_INVALID_REGNUM, // CVRegPCDR4 |
| LLDB_INVALID_REGNUM, // CVRegPCDR5 |
| LLDB_INVALID_REGNUM, // CVRegPCDR6 |
| LLDB_INVALID_REGNUM, // CVRegPCDR7 |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, // CVRegCR0 |
| LLDB_INVALID_REGNUM, // CVRegCR1 |
| LLDB_INVALID_REGNUM, // CVRegCR2 |
| LLDB_INVALID_REGNUM, // CVRegCR3 |
| LLDB_INVALID_REGNUM, // CVRegCR4 |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| lldb_dr0_i386, // CVRegDR0 |
| lldb_dr1_i386, // CVRegDR1 |
| lldb_dr2_i386, // CVRegDR2 |
| lldb_dr3_i386, // CVRegDR3 |
| lldb_dr4_i386, // CVRegDR4 |
| lldb_dr5_i386, // CVRegDR5 |
| lldb_dr6_i386, // CVRegDR6 |
| lldb_dr7_i386, // CVRegDR7 |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, // CVRegGDTR |
| LLDB_INVALID_REGNUM, // CVRegGDTL |
| LLDB_INVALID_REGNUM, // CVRegIDTR |
| LLDB_INVALID_REGNUM, // CVRegIDTL |
| LLDB_INVALID_REGNUM, // CVRegLDTR |
| LLDB_INVALID_REGNUM, // CVRegTR |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO1 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO2 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO3 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO4 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO5 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO6 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO7 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO8 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO9 |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| lldb_st0_i386, // CVRegST0 |
| lldb_st1_i386, // CVRegST1 |
| lldb_st2_i386, // CVRegST2 |
| lldb_st3_i386, // CVRegST3 |
| lldb_st4_i386, // CVRegST4 |
| lldb_st5_i386, // CVRegST5 |
| lldb_st6_i386, // CVRegST6 |
| lldb_st7_i386, // CVRegST7 |
| LLDB_INVALID_REGNUM, // CVRegCTRL |
| LLDB_INVALID_REGNUM, // CVRegSTAT |
| LLDB_INVALID_REGNUM, // CVRegTAG |
| LLDB_INVALID_REGNUM, // CVRegFPIP |
| LLDB_INVALID_REGNUM, // CVRegFPCS |
| LLDB_INVALID_REGNUM, // CVRegFPDO |
| LLDB_INVALID_REGNUM, // CVRegFPDS |
| LLDB_INVALID_REGNUM, // CVRegISEM |
| LLDB_INVALID_REGNUM, // CVRegFPEIP |
| LLDB_INVALID_REGNUM, // CVRegFPEDO |
| lldb_mm0_i386, // CVRegMM0 |
| lldb_mm1_i386, // CVRegMM1 |
| lldb_mm2_i386, // CVRegMM2 |
| lldb_mm3_i386, // CVRegMM3 |
| lldb_mm4_i386, // CVRegMM4 |
| lldb_mm5_i386, // CVRegMM5 |
| lldb_mm6_i386, // CVRegMM6 |
| lldb_mm7_i386, // CVRegMM7 |
| lldb_xmm0_i386, // CVRegXMM0 |
| lldb_xmm1_i386, // CVRegXMM1 |
| lldb_xmm2_i386, // CVRegXMM2 |
| lldb_xmm3_i386, // CVRegXMM3 |
| lldb_xmm4_i386, // CVRegXMM4 |
| lldb_xmm5_i386, // CVRegXMM5 |
| lldb_xmm6_i386, // CVRegXMM6 |
| lldb_xmm7_i386 // CVRegXMM7 |
| }; |
| |
| const uint32_t g_code_view_to_lldb_registers_x86_64[] = { |
| LLDB_INVALID_REGNUM, // CVRegNONE |
| lldb_al_x86_64, // CVRegAL |
| lldb_cl_x86_64, // CVRegCL |
| lldb_dl_x86_64, // CVRegDL |
| lldb_bl_x86_64, // CVRegBL |
| lldb_ah_x86_64, // CVRegAH |
| lldb_ch_x86_64, // CVRegCH |
| lldb_dh_x86_64, // CVRegDH |
| lldb_bh_x86_64, // CVRegBH |
| lldb_ax_x86_64, // CVRegAX |
| lldb_cx_x86_64, // CVRegCX |
| lldb_dx_x86_64, // CVRegDX |
| lldb_bx_x86_64, // CVRegBX |
| lldb_sp_x86_64, // CVRegSP |
| lldb_bp_x86_64, // CVRegBP |
| lldb_si_x86_64, // CVRegSI |
| lldb_di_x86_64, // CVRegDI |
| lldb_eax_x86_64, // CVRegEAX |
| lldb_ecx_x86_64, // CVRegECX |
| lldb_edx_x86_64, // CVRegEDX |
| lldb_ebx_x86_64, // CVRegEBX |
| lldb_esp_x86_64, // CVRegESP |
| lldb_ebp_x86_64, // CVRegEBP |
| lldb_esi_x86_64, // CVRegESI |
| lldb_edi_x86_64, // CVRegEDI |
| lldb_es_x86_64, // CVRegES |
| lldb_cs_x86_64, // CVRegCS |
| lldb_ss_x86_64, // CVRegSS |
| lldb_ds_x86_64, // CVRegDS |
| lldb_fs_x86_64, // CVRegFS |
| lldb_gs_x86_64, // CVRegGS |
| LLDB_INVALID_REGNUM, // CVRegIP |
| LLDB_INVALID_REGNUM, // CVRegFLAGS |
| LLDB_INVALID_REGNUM, // CVRegEIP |
| LLDB_INVALID_REGNUM, // CVRegEFLAGS |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, // CVRegTEMP |
| LLDB_INVALID_REGNUM, // CVRegTEMPH |
| LLDB_INVALID_REGNUM, // CVRegQUOTE |
| LLDB_INVALID_REGNUM, // CVRegPCDR3 |
| LLDB_INVALID_REGNUM, // CVRegPCDR4 |
| LLDB_INVALID_REGNUM, // CVRegPCDR5 |
| LLDB_INVALID_REGNUM, // CVRegPCDR6 |
| LLDB_INVALID_REGNUM, // CVRegPCDR7 |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, // CVRegCR0 |
| LLDB_INVALID_REGNUM, // CVRegCR1 |
| LLDB_INVALID_REGNUM, // CVRegCR2 |
| LLDB_INVALID_REGNUM, // CVRegCR3 |
| LLDB_INVALID_REGNUM, // CVRegCR4 |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| lldb_dr0_x86_64, // CVRegDR0 |
| lldb_dr1_x86_64, // CVRegDR1 |
| lldb_dr2_x86_64, // CVRegDR2 |
| lldb_dr3_x86_64, // CVRegDR3 |
| lldb_dr4_x86_64, // CVRegDR4 |
| lldb_dr5_x86_64, // CVRegDR5 |
| lldb_dr6_x86_64, // CVRegDR6 |
| lldb_dr7_x86_64, // CVRegDR7 |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, // CVRegGDTR |
| LLDB_INVALID_REGNUM, // CVRegGDTL |
| LLDB_INVALID_REGNUM, // CVRegIDTR |
| LLDB_INVALID_REGNUM, // CVRegIDTL |
| LLDB_INVALID_REGNUM, // CVRegLDTR |
| LLDB_INVALID_REGNUM, // CVRegTR |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO1 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO2 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO3 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO4 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO5 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO6 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO7 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO8 |
| LLDB_INVALID_REGNUM, // CVRegPSEUDO9 |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| lldb_st0_x86_64, // CVRegST0 |
| lldb_st1_x86_64, // CVRegST1 |
| lldb_st2_x86_64, // CVRegST2 |
| lldb_st3_x86_64, // CVRegST3 |
| lldb_st4_x86_64, // CVRegST4 |
| lldb_st5_x86_64, // CVRegST5 |
| lldb_st6_x86_64, // CVRegST6 |
| lldb_st7_x86_64, // CVRegST7 |
| LLDB_INVALID_REGNUM, // CVRegCTRL |
| LLDB_INVALID_REGNUM, // CVRegSTAT |
| LLDB_INVALID_REGNUM, // CVRegTAG |
| LLDB_INVALID_REGNUM, // CVRegFPIP |
| LLDB_INVALID_REGNUM, // CVRegFPCS |
| LLDB_INVALID_REGNUM, // CVRegFPDO |
| LLDB_INVALID_REGNUM, // CVRegFPDS |
| LLDB_INVALID_REGNUM, // CVRegISEM |
| LLDB_INVALID_REGNUM, // CVRegFPEIP |
| LLDB_INVALID_REGNUM, // CVRegFPEDO |
| lldb_mm0_x86_64, // CVRegMM0 |
| lldb_mm1_x86_64, // CVRegMM1 |
| lldb_mm2_x86_64, // CVRegMM2 |
| lldb_mm3_x86_64, // CVRegMM3 |
| lldb_mm4_x86_64, // CVRegMM4 |
| lldb_mm5_x86_64, // CVRegMM5 |
| lldb_mm6_x86_64, // CVRegMM6 |
| lldb_mm7_x86_64, // CVRegMM7 |
| lldb_xmm0_x86_64, // CVRegXMM0 |
| lldb_xmm1_x86_64, // CVRegXMM1 |
| lldb_xmm2_x86_64, // CVRegXMM2 |
| lldb_xmm3_x86_64, // CVRegXMM3 |
| lldb_xmm4_x86_64, // CVRegXMM4 |
| lldb_xmm5_x86_64, // CVRegXMM5 |
| lldb_xmm6_x86_64, // CVRegXMM6 |
| lldb_xmm7_x86_64, // CVRegXMM7 |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, |
| lldb_mxcsr_x86_64, // CVRegMXCSR |
| LLDB_INVALID_REGNUM, // CVRegEDXEAX |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, // CVRegEMM0L |
| LLDB_INVALID_REGNUM, // CVRegEMM1L |
| LLDB_INVALID_REGNUM, // CVRegEMM2L |
| LLDB_INVALID_REGNUM, // CVRegEMM3L |
| LLDB_INVALID_REGNUM, // CVRegEMM4L |
| LLDB_INVALID_REGNUM, // CVRegEMM5L |
| LLDB_INVALID_REGNUM, // CVRegEMM6L |
| LLDB_INVALID_REGNUM, // CVRegEMM7L |
| LLDB_INVALID_REGNUM, // CVRegEMM0H |
| LLDB_INVALID_REGNUM, // CVRegEMM1H |
| LLDB_INVALID_REGNUM, // CVRegEMM2H |
| LLDB_INVALID_REGNUM, // CVRegEMM3H |
| LLDB_INVALID_REGNUM, // CVRegEMM4H |
| LLDB_INVALID_REGNUM, // CVRegEMM5H |
| LLDB_INVALID_REGNUM, // CVRegEMM6H |
| LLDB_INVALID_REGNUM, // CVRegEMM7H |
| LLDB_INVALID_REGNUM, // CVRegMM00 |
| LLDB_INVALID_REGNUM, // CVRegMM01 |
| LLDB_INVALID_REGNUM, // CVRegMM10 |
| LLDB_INVALID_REGNUM, // CVRegMM11 |
| LLDB_INVALID_REGNUM, // CVRegMM20 |
| LLDB_INVALID_REGNUM, // CVRegMM21 |
| LLDB_INVALID_REGNUM, // CVRegMM30 |
| LLDB_INVALID_REGNUM, // CVRegMM31 |
| LLDB_INVALID_REGNUM, // CVRegMM40 |
| LLDB_INVALID_REGNUM, // CVRegMM41 |
| LLDB_INVALID_REGNUM, // CVRegMM50 |
| LLDB_INVALID_REGNUM, // CVRegMM51 |
| LLDB_INVALID_REGNUM, // CVRegMM60 |
| LLDB_INVALID_REGNUM, // CVRegMM61 |
| LLDB_INVALID_REGNUM, // CVRegMM70 |
| LLDB_INVALID_REGNUM, // CVRegMM71 |
| lldb_xmm8_x86_64, // CVRegXMM8 |
| lldb_xmm9_x86_64, // CVRegXMM9 |
| lldb_xmm10_x86_64, // CVRegXMM10 |
| lldb_xmm11_x86_64, // CVRegXMM11 |
| lldb_xmm12_x86_64, // CVRegXMM12 |
| lldb_xmm13_x86_64, // CVRegXMM13 |
| lldb_xmm14_x86_64, // CVRegXMM14 |
| lldb_xmm15_x86_64, // CVRegXMM15 |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, |
| lldb_sil_x86_64, // CVRegSIL |
| lldb_dil_x86_64, // CVRegDIL |
| lldb_bpl_x86_64, // CVRegBPL |
| lldb_spl_x86_64, // CVRegSPL |
| lldb_rax_x86_64, // CVRegRAX |
| lldb_rbx_x86_64, // CVRegRBX |
| lldb_rcx_x86_64, // CVRegRCX |
| lldb_rdx_x86_64, // CVRegRDX |
| lldb_rsi_x86_64, // CVRegRSI |
| lldb_rdi_x86_64, // CVRegRDI |
| lldb_rbp_x86_64, // CVRegRBP |
| lldb_rsp_x86_64, // CVRegRSP |
| lldb_r8_x86_64, // CVRegR8 |
| lldb_r9_x86_64, // CVRegR9 |
| lldb_r10_x86_64, // CVRegR10 |
| lldb_r11_x86_64, // CVRegR11 |
| lldb_r12_x86_64, // CVRegR12 |
| lldb_r13_x86_64, // CVRegR13 |
| lldb_r14_x86_64, // CVRegR14 |
| lldb_r15_x86_64, // CVRegR15 |
| lldb_r8l_x86_64, // CVRegR8B |
| lldb_r9l_x86_64, // CVRegR9B |
| lldb_r10l_x86_64, // CVRegR10B |
| lldb_r11l_x86_64, // CVRegR11B |
| lldb_r12l_x86_64, // CVRegR12B |
| lldb_r13l_x86_64, // CVRegR13B |
| lldb_r14l_x86_64, // CVRegR14B |
| lldb_r15l_x86_64, // CVRegR15B |
| lldb_r8w_x86_64, // CVRegR8W |
| lldb_r9w_x86_64, // CVRegR9W |
| lldb_r10w_x86_64, // CVRegR10W |
| lldb_r11w_x86_64, // CVRegR11W |
| lldb_r12w_x86_64, // CVRegR12W |
| lldb_r13w_x86_64, // CVRegR13W |
| lldb_r14w_x86_64, // CVRegR14W |
| lldb_r15w_x86_64, // CVRegR15W |
| lldb_r8d_x86_64, // CVRegR8D |
| lldb_r9d_x86_64, // CVRegR9D |
| lldb_r10d_x86_64, // CVRegR10D |
| lldb_r11d_x86_64, // CVRegR11D |
| lldb_r12d_x86_64, // CVRegR12D |
| lldb_r13d_x86_64, // CVRegR13D |
| lldb_r14d_x86_64, // CVRegR14D |
| lldb_r15d_x86_64, // CVRegR15D |
| lldb_ymm0_x86_64, // CVRegAMD64_YMM0 |
| lldb_ymm1_x86_64, // CVRegAMD64_YMM1 |
| lldb_ymm2_x86_64, // CVRegAMD64_YMM2 |
| lldb_ymm3_x86_64, // CVRegAMD64_YMM3 |
| lldb_ymm4_x86_64, // CVRegAMD64_YMM4 |
| lldb_ymm5_x86_64, // CVRegAMD64_YMM5 |
| lldb_ymm6_x86_64, // CVRegAMD64_YMM6 |
| lldb_ymm7_x86_64, // CVRegAMD64_YMM7 |
| lldb_ymm8_x86_64, // CVRegAMD64_YMM8 |
| lldb_ymm9_x86_64, // CVRegAMD64_YMM9 |
| lldb_ymm10_x86_64, // CVRegAMD64_YMM10 |
| lldb_ymm11_x86_64, // CVRegAMD64_YMM11 |
| lldb_ymm12_x86_64, // CVRegAMD64_YMM12 |
| lldb_ymm13_x86_64, // CVRegAMD64_YMM13 |
| lldb_ymm14_x86_64, // CVRegAMD64_YMM14 |
| lldb_ymm15_x86_64, // CVRegAMD64_YMM15 |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, |
| lldb_bnd0_x86_64, // CVRegBND0 |
| lldb_bnd1_x86_64, // CVRegBND1 |
| lldb_bnd2_x86_64 // CVRegBND2 |
| }; |
| |
| uint32_t GetLLDBRegisterNumber(llvm::Triple::ArchType arch_type, |
| llvm::codeview::RegisterId register_id) { |
| switch (arch_type) { |
| case llvm::Triple::x86: |
| if (static_cast<uint16_t>(register_id) < |
| sizeof(g_code_view_to_lldb_registers_x86) / |
| sizeof(g_code_view_to_lldb_registers_x86[0])) |
| return g_code_view_to_lldb_registers_x86[static_cast<uint16_t>( |
| register_id)]; |
| |
| switch (register_id) { |
| case llvm::codeview::RegisterId::CVRegMXCSR: |
| return lldb_mxcsr_i386; |
| case llvm::codeview::RegisterId::CVRegBND0: |
| return lldb_bnd0_i386; |
| case llvm::codeview::RegisterId::CVRegBND1: |
| return lldb_bnd1_i386; |
| case llvm::codeview::RegisterId::CVRegBND2: |
| return lldb_bnd2_i386; |
| default: |
| return LLDB_INVALID_REGNUM; |
| } |
| case llvm::Triple::x86_64: |
| if (static_cast<uint16_t>(register_id) < |
| sizeof(g_code_view_to_lldb_registers_x86_64) / |
| sizeof(g_code_view_to_lldb_registers_x86_64[0])) |
| return g_code_view_to_lldb_registers_x86_64[static_cast<uint16_t>( |
| register_id)]; |
| |
| return LLDB_INVALID_REGNUM; |
| default: |
| return LLDB_INVALID_REGNUM; |
| } |
| } |
| |
| uint32_t GetGenericRegisterNumber(llvm::codeview::RegisterId register_id) { |
| if (register_id == llvm::codeview::RegisterId::CVRegVFRAME) |
| return LLDB_REGNUM_GENERIC_FP; |
| |
| return LLDB_INVALID_REGNUM; |
| } |
| |
| uint32_t GetRegisterNumber(llvm::Triple::ArchType arch_type, |
| llvm::codeview::RegisterId register_id, |
| RegisterKind ®ister_kind) { |
| register_kind = eRegisterKindLLDB; |
| uint32_t reg_num = GetLLDBRegisterNumber(arch_type, register_id); |
| if (reg_num != LLDB_INVALID_REGNUM) |
| return reg_num; |
| |
| register_kind = eRegisterKindGeneric; |
| return GetGenericRegisterNumber(register_id); |
| } |
| } // namespace |
| |
| DWARFExpression ConvertPDBLocationToDWARFExpression(ModuleSP module, |
| const PDBSymbolData &symbol, |
| bool &is_constant) { |
| is_constant = true; |
| |
| if (!module) |
| return DWARFExpression(nullptr); |
| |
| const ArchSpec &architecture = module->GetArchitecture(); |
| llvm::Triple::ArchType arch_type = architecture.GetMachine(); |
| ByteOrder byte_order = architecture.GetByteOrder(); |
| uint32_t address_size = architecture.GetAddressByteSize(); |
| uint32_t byte_size = architecture.GetDataByteSize(); |
| if (byte_order == eByteOrderInvalid || address_size == 0) |
| return DWARFExpression(nullptr); |
| |
| RegisterKind register_kind = eRegisterKindDWARF; |
| StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order); |
| switch (symbol.getLocationType()) { |
| case PDB_LocType::Static: |
| case PDB_LocType::TLS: { |
| stream.PutHex8(DW_OP_addr); |
| |
| SectionList *section_list = module->GetSectionList(); |
| if (!section_list) |
| return DWARFExpression(nullptr); |
| |
| uint32_t section_idx = symbol.getAddressSection() - 1; |
| if (section_idx >= section_list->GetSize()) |
| return DWARFExpression(nullptr); |
| |
| auto section = section_list->GetSectionAtIndex(section_idx); |
| if (!section) |
| return DWARFExpression(nullptr); |
| |
| uint32_t offset = symbol.getAddressOffset(); |
| stream.PutMaxHex64(section->GetFileAddress() + offset, address_size, |
| byte_order); |
| |
| is_constant = false; |
| |
| break; |
| } |
| case PDB_LocType::RegRel: { |
| uint32_t reg_num = |
| GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind); |
| if (reg_num == LLDB_INVALID_REGNUM) |
| return DWARFExpression(nullptr); |
| |
| if (reg_num > 31) { |
| stream.PutHex8(DW_OP_bregx); |
| stream.PutULEB128(reg_num); |
| } else |
| stream.PutHex8(DW_OP_breg0 + reg_num); |
| |
| int32_t offset = symbol.getOffset(); |
| stream.PutSLEB128(offset); |
| |
| is_constant = false; |
| |
| break; |
| } |
| case PDB_LocType::Enregistered: { |
| uint32_t reg_num = |
| GetRegisterNumber(arch_type, symbol.getRegisterId(), register_kind); |
| if (reg_num == LLDB_INVALID_REGNUM) |
| return DWARFExpression(nullptr); |
| |
| if (reg_num > 31) { |
| stream.PutHex8(DW_OP_regx); |
| stream.PutULEB128(reg_num); |
| } else |
| stream.PutHex8(DW_OP_reg0 + reg_num); |
| |
| is_constant = false; |
| |
| break; |
| } |
| case PDB_LocType::Constant: { |
| Variant value = symbol.getValue(); |
| stream.PutRawBytes(&value.Value, sizeof(value.Value), |
| endian::InlHostByteOrder()); |
| break; |
| } |
| default: |
| return DWARFExpression(nullptr); |
| } |
| |
| DataBufferSP buffer = |
| std::make_shared<DataBufferHeap>(stream.GetData(), stream.GetSize()); |
| DataExtractor extractor(buffer, byte_order, address_size, byte_size); |
| DWARFExpression result(module, extractor, nullptr, 0, buffer->GetByteSize()); |
| result.SetRegisterKind(register_kind); |
| |
| return result; |
| } |