aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/SymbolFile/NativePDB/DWARFLocationExpression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/SymbolFile/NativePDB/DWARFLocationExpression.cpp')
-rw-r--r--lldb/source/Plugins/SymbolFile/NativePDB/DWARFLocationExpression.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/DWARFLocationExpression.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/DWARFLocationExpression.cpp
index d0672352a58f..3ba0079c96e6 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/DWARFLocationExpression.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/DWARFLocationExpression.cpp
@@ -250,3 +250,30 @@ DWARFExpression lldb_private::npdb::MakeConstantLocationExpression(
DWARFExpression result(nullptr, extractor, nullptr);
return result;
}
+
+DWARFExpression lldb_private::npdb::MakeEnregisteredLocationExpressionForClass(
+ std::map<uint64_t, std::pair<RegisterId, uint32_t>> &members_info,
+ lldb::ModuleSP module) {
+ return MakeLocationExpressionInternal(
+ module, [&](Stream &stream, RegisterKind &register_kind) -> bool {
+ for (auto pair : members_info) {
+ std::pair<RegisterId, uint32_t> member_info = pair.second;
+ if (member_info.first != llvm::codeview::RegisterId::NONE) {
+ uint32_t reg_num =
+ GetRegisterNumber(module->GetArchitecture().GetMachine(),
+ member_info.first, register_kind);
+ if (reg_num == LLDB_INVALID_REGNUM)
+ return false;
+ if (reg_num > 31) {
+ stream.PutHex8(llvm::dwarf::DW_OP_regx);
+ stream.PutULEB128(reg_num);
+ } else {
+ stream.PutHex8(llvm::dwarf::DW_OP_reg0 + reg_num);
+ }
+ }
+ stream.PutHex8(llvm::dwarf::DW_OP_piece);
+ stream.PutULEB128(member_info.second);
+ }
+ return true;
+ });
+}