[Lldb-commits] [PATCH] D135664: [wasm] Always treat DWARF expression addresses as load addresses
Philip Pfaffe via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Fri Oct 28 04:03:12 PDT 2022
pfaffe updated this revision to Diff 471486.
pfaffe added a comment.
Bring back lost changes...
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D135664/new/
https://reviews.llvm.org/D135664
Files:
lldb/source/Expression/DWARFExpression.cpp
lldb/unittests/Expression/DWARFExpressionTest.cpp
Index: lldb/unittests/Expression/DWARFExpressionTest.cpp
===================================================================
--- lldb/unittests/Expression/DWARFExpressionTest.cpp
+++ lldb/unittests/Expression/DWARFExpressionTest.cpp
@@ -401,3 +401,35 @@
Evaluate({DW_OP_lit4, DW_OP_deref, DW_OP_stack_value}, {}, {}, &exe_ctx),
llvm::HasValue(GetScalar(32, 0x07060504, false)));
}
+
+TEST_F(DWARFExpressionMockProcessTest, WASM_DW_OP_addr) {
+
+ ArchSpec arch("wasm32-unknown-unknown-wasm");
+ lldb::PlatformSP host_platform_sp =
+ platform_linux::PlatformLinux::CreateInstance(true, &arch);
+ ASSERT_TRUE(host_platform_sp);
+ Platform::SetHostPlatform(host_platform_sp);
+ lldb::DebuggerSP debugger_sp = Debugger::CreateInstance();
+ ASSERT_TRUE(debugger_sp);
+ lldb::TargetSP target_sp;
+ lldb::PlatformSP platform_sp;
+ debugger_sp->GetTargetList().CreateTarget(*debugger_sp, "", arch,
+ lldb_private::eLoadDependentsNo,
+ platform_sp, target_sp);
+
+ ExecutionContext exe_ctx(target_sp, false);
+ // Single DW_OP_addr takes a single operand of address size width:
+ uint8_t expr[] = {DW_OP_addr, 0x40, 0x0, 0x0, 0x0};
+ DataExtractor extractor(expr, sizeof(expr), lldb::eByteOrderLittle,
+ /*addr_size*/ 4);
+ Value result;
+ Status status;
+ ASSERT_TRUE(DWARFExpression::Evaluate(
+ &exe_ctx, /*reg_ctx*/ nullptr, /*module_sp*/ {}, extractor,
+ /*unit*/ nullptr, lldb::eRegisterKindLLDB,
+ /*initial_value_ptr*/ nullptr,
+ /*object_address_ptr*/ nullptr, result, &status))
+ << status.ToError();
+
+ ASSERT_EQ(result.GetValueType(), Value::ValueType::LoadAddress);
+}
Index: lldb/source/Expression/DWARFExpression.cpp
===================================================================
--- lldb/source/Expression/DWARFExpression.cpp
+++ lldb/source/Expression/DWARFExpression.cpp
@@ -847,10 +847,12 @@
Process *process = nullptr;
StackFrame *frame = nullptr;
+ Target *target = nullptr;
if (exe_ctx) {
process = exe_ctx->GetProcessPtr();
frame = exe_ctx->GetFramePtr();
+ target = exe_ctx->GetTargetPtr();
}
if (reg_ctx == nullptr && frame)
reg_ctx = frame->GetRegisterContext().get();
@@ -906,12 +908,19 @@
// address and whose size is the size of an address on the target machine.
case DW_OP_addr:
stack.push_back(Scalar(opcodes.GetAddress(&offset)));
- stack.back().SetValueType(Value::ValueType::FileAddress);
- // Convert the file address to a load address, so subsequent
- // DWARF operators can operate on it.
- if (frame)
- stack.back().ConvertToLoadAddress(module_sp.get(),
- frame->CalculateTarget().get());
+ if (target &&
+ target->GetArchitecture().GetCore() == ArchSpec::eCore_wasm32) {
+ // wasm file sections aren't mapped into memory, therefore addresses can
+ // never point into a file section and are always LoadAddresses.
+ stack.back().SetValueType(Value::ValueType::LoadAddress);
+ } else {
+ stack.back().SetValueType(Value::ValueType::FileAddress);
+ // Convert the file address to a load address, so subsequent
+ // DWARF operators can operate on it.
+ if (frame)
+ stack.back().ConvertToLoadAddress(module_sp.get(),
+ frame->CalculateTarget().get());
+ }
break;
// The DW_OP_addr_sect_offset4 is used for any location expressions in
@@ -2507,7 +2516,14 @@
uint64_t index = opcodes.GetULEB128(&offset);
lldb::addr_t value = dwarf_cu->ReadAddressFromDebugAddrSection(index);
stack.push_back(Scalar(value));
- stack.back().SetValueType(Value::ValueType::FileAddress);
+ if (target &&
+ target->GetArchitecture().GetCore() == ArchSpec::eCore_wasm32) {
+ // wasm file sections aren't mapped into memory, therefore addresses can
+ // never point into a file section and are always LoadAddresses.
+ stack.back().SetValueType(Value::ValueType::LoadAddress);
+ } else {
+ stack.back().SetValueType(Value::ValueType::FileAddress);
+ }
} break;
// OPCODE: DW_OP_GNU_const_index
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D135664.471486.patch
Type: text/x-patch
Size: 4324 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20221028/35d0159d/attachment.bin>
More information about the lldb-commits
mailing list