Added the ability for DWARF locations to use the ABI plug-ins to resolve
register names when dumping variable locations and location lists. Also did
some cleanup where "int" types were being used for "lldb::RegisterKind"
values.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@138988 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Expression/DWARFExpression.cpp b/source/Expression/DWARFExpression.cpp
index fb00615..d47c045 100644
--- a/source/Expression/DWARFExpression.cpp
+++ b/source/Expression/DWARFExpression.cpp
@@ -30,6 +30,7 @@
#include "lldb/Symbol/ClangASTContext.h"
#include "lldb/Symbol/Type.h"
+#include "lldb/Target/ABI.h"
#include "lldb/Target/ExecutionContext.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/RegisterContext.h"
@@ -264,7 +265,7 @@
}
void
-DWARFExpression::DumpLocation (Stream *s, uint32_t offset, uint32_t length, lldb::DescriptionLevel level) const
+DWARFExpression::DumpLocation (Stream *s, uint32_t offset, uint32_t length, lldb::DescriptionLevel level, ABI *abi) const
{
if (!m_data.ValidOffsetForDataOfSize(offset, length))
return;
@@ -409,7 +410,29 @@
case DW_OP_reg28: // 0x6C
case DW_OP_reg29: // 0x6D
case DW_OP_reg30: // 0x6E
- case DW_OP_reg31: s->Printf("DW_OP_reg%i", op - DW_OP_reg0); break; // 0x6f
+ case DW_OP_reg31: // 0x6F
+ {
+ uint32_t reg_num = op - DW_OP_reg0;
+ if (abi)
+ {
+ RegisterInfo reg_info;
+ if (abi->GetRegisterInfoByKind(m_reg_kind, reg_num, reg_info))
+ {
+ if (reg_info.name)
+ {
+ s->PutCString (reg_info.name);
+ break;
+ }
+ else if (reg_info.alt_name)
+ {
+ s->PutCString (reg_info.alt_name);
+ break;
+ }
+ }
+ }
+ s->Printf("DW_OP_reg%u", reg_num); break;
+ }
+ break;
case DW_OP_breg0:
case DW_OP_breg1:
@@ -442,16 +465,80 @@
case DW_OP_breg28:
case DW_OP_breg29:
case DW_OP_breg30:
- case DW_OP_breg31: s->Printf("DW_OP_breg%i(0x%x)", op - DW_OP_breg0, m_data.GetULEB128(&offset)); break;
+ case DW_OP_breg31:
+ {
+ uint32_t reg_num = op - DW_OP_breg0;
+ int64_t reg_offset = m_data.GetSLEB128(&offset);
+ if (abi)
+ {
+ RegisterInfo reg_info;
+ if (abi->GetRegisterInfoByKind(m_reg_kind, reg_num, reg_info))
+ {
+ if (reg_info.name)
+ {
+ s->Printf("[%s%+lli]", reg_info.name, reg_offset);
+ break;
+ }
+ else if (reg_info.alt_name)
+ {
+ s->Printf("[%s%+lli]", reg_info.alt_name, reg_offset);
+ break;
+ }
+ }
+ }
+ s->Printf("DW_OP_breg%i(0x%llx)", reg_num, reg_offset);
+ }
+ break;
case DW_OP_regx: // 0x90 1 ULEB128 register
- s->Printf("DW_OP_regx(0x%x)", m_data.GetULEB128(&offset));
+ {
+ uint64_t reg_num = m_data.GetULEB128(&offset);
+ if (abi)
+ {
+ RegisterInfo reg_info;
+ if (abi->GetRegisterInfoByKind(m_reg_kind, reg_num, reg_info))
+ {
+ if (reg_info.name)
+ {
+ s->PutCString (reg_info.name);
+ break;
+ }
+ else if (reg_info.alt_name)
+ {
+ s->PutCString (reg_info.alt_name);
+ break;
+ }
+ }
+ }
+ s->Printf("DW_OP_regx(%llu)", reg_num); break;
+ }
break;
case DW_OP_fbreg: // 0x91 1 SLEB128 offset
- s->Printf("DW_OP_fbreg(0x%x)",m_data.GetSLEB128(&offset));
+ s->Printf("DW_OP_fbreg(%lli)",m_data.GetSLEB128(&offset));
break;
case DW_OP_bregx: // 0x92 2 ULEB128 register followed by SLEB128 offset
- s->Printf("DW_OP_bregx(0x%x, 0x%x)", m_data.GetULEB128(&offset), m_data.GetSLEB128(&offset));
+ {
+ uint32_t reg_num = m_data.GetULEB128(&offset);
+ int64_t reg_offset = m_data.GetSLEB128(&offset);
+ if (abi)
+ {
+ RegisterInfo reg_info;
+ if (abi->GetRegisterInfoByKind(m_reg_kind, reg_num, reg_info))
+ {
+ if (reg_info.name)
+ {
+ s->Printf("[%s%+lli]", reg_info.name, reg_offset);
+ break;
+ }
+ else if (reg_info.alt_name)
+ {
+ s->Printf("[%s%+lli]", reg_info.alt_name, reg_offset);
+ break;
+ }
+ }
+ }
+ s->Printf("DW_OP_bregx(reg=%u,offset=%lli)", reg_num, reg_offset);
+ }
break;
case DW_OP_piece: // 0x93 1 ULEB128 size of piece addressed
s->Printf("DW_OP_piece(0x%x)", m_data.GetULEB128(&offset));
@@ -546,7 +633,7 @@
}
void
-DWARFExpression::SetRegisterKind (int reg_kind)
+DWARFExpression::SetRegisterKind (RegisterKind reg_kind)
{
m_reg_kind = reg_kind;
}
@@ -558,7 +645,7 @@
}
void
-DWARFExpression::GetDescription (Stream *s, lldb::DescriptionLevel level, addr_t location_list_base_addr) const
+DWARFExpression::GetDescription (Stream *s, lldb::DescriptionLevel level, addr_t location_list_base_addr, ABI *abi) const
{
if (IsLocationList())
{
@@ -578,7 +665,7 @@
addr_range.Dump(s, 0, 8);
s->PutChar('{');
uint32_t location_length = m_data.GetU16(&offset);
- DumpLocation (s, offset, location_length, level);
+ DumpLocation (s, offset, location_length, level, abi);
s->PutChar('}');
offset += location_length;
}
@@ -606,7 +693,7 @@
else
{
// We have a normal location that contains DW_OP location opcodes
- DumpLocation (s, 0, m_data.GetByteSize(), level);
+ DumpLocation (s, 0, m_data.GetByteSize(), level, abi);
}
}
@@ -791,7 +878,8 @@
DWARFExpression::DumpLocationForAddress (Stream *s,
lldb::DescriptionLevel level,
addr_t base_addr,
- addr_t address)
+ addr_t address,
+ ABI *abi)
{
uint32_t offset = 0;
uint32_t length = 0;
@@ -800,7 +888,7 @@
{
if (length > 0)
{
- DumpLocation(s, offset, length, level);
+ DumpLocation(s, offset, length, level, abi);
return true;
}
}