[Lldb-commits] [lldb] [lldb][RISCV] Fix return value reading (PR #163931)
Georgiy Samoylov via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 23 04:16:50 PDT 2025
================
@@ -602,7 +604,104 @@ GetValObjFromFPRegs(Thread &thread, const RegisterContextSP ®_ctx,
value, ConstString(""));
}
// we should never reach this, but if we do, use the integer registers
- return GetValObjFromIntRegs(thread, reg_ctx, machine, type_flags, byte_size);
+ return GetValObjFromIntRegs(thread, reg_ctx, machine, compiler_type,
+ byte_size);
+}
+
+static DataExtractor CopyReturnValueToBuffer(ExecutionContext &exe_ctx,
+ RegisterValue &a0_reg_value,
+ RegisterValue &a1_reg_value,
+ const size_t xlen_byte_size,
+ const uint32_t byte_size) {
+
+ DataExtractor a0_extractor;
+ DataExtractor a1_extractor;
+
+ // RISC-V ABI stands:
+ // "Aggregates whose total size is no more than XLEN bits
+ // are passed in a register, with the fields laid out as though
+ // they were passed in memory."
+ if (byte_size <= xlen_byte_size) {
+ // value is stored only in a0
+ a0_reg_value.GetData(a0_extractor);
+ // shrink data to byte_size length
+ DataExtractor data{a0_extractor, 0, byte_size};
+ return data;
+ }
+
+ // "Aggregates whose total size is no more than 2×XLEN bits
+ // are passed in a pair of registers;"
+ if (byte_size <= 2 * xlen_byte_size) {
+ // value is stored in a0 and a1 consequently
+ a0_reg_value.GetData(a0_extractor);
+ a1_reg_value.GetData(a1_extractor);
+ a0_extractor.Append(a1_extractor);
+ // shrink data to byte_size length
+ DataExtractor data{a0_extractor, 0, byte_size};
+ return data;
+ }
+
+ // "Aggregates larger than 2×XLEN bits are passed by reference
+ // and are replaced in the argument list with the address"
+ const lldb::addr_t value_addr =
+ a1_reg_value.GetAsUInt64(LLDB_INVALID_ADDRESS, nullptr);
+
+ if (value_addr == LLDB_INVALID_ADDRESS)
+ return DataExtractor{};
+
+ Status error;
+ WritableDataBufferSP data_sp(new DataBufferHeap(byte_size, 0));
+ if (exe_ctx.GetProcessRef().ReadMemory(value_addr, data_sp->GetBytes(),
+ byte_size, error) != byte_size ||
+ error.Fail())
+ return DataExtractor{};
+
+ DataExtractor data;
+ data.SetData(data_sp);
+ return data;
----------------
sga-sc wrote:
In this case I can't do it in one line because [DataExtractor constructor](https://lldb.llvm.org/cpp_reference/classlldb__private_1_1DataExtractor.html#aa34edc5c5ac945be4905b6fc33ab2b2a) also needs byte order and address size which I set after return value creation
https://github.com/llvm/llvm-project/pull/163931
More information about the lldb-commits
mailing list