The current version of SymbolFilePDB::ParseVariableForPDBData function always initializes variables with an empty location. This patch adds the converter of a location information from PDB to a DWARF expression, so it becomes possible to watch values of variables of primitive data types. At the moment the converter supports only Static, TLS, RegRel, Enregistered and Constant PDB location types, but it seems that it's enough for most cases. There are still some problems with retrieving values of variables (e.g. we can't watch variables of composite types), but they look not relevant to the conversion to DWARF. Patch by: Aleksandr Urakov Differential revision: https://reviews.llvm.org/D49018 llvm-svn: 336988
586 lines
22 KiB
C++
586 lines
22 KiB
C++
//===-- 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;
|
|
}
|