================
@@ -367,7 +379,67 @@ class InterpreterStackFrame {
return true;
}
- bool ResolveConstant(lldb::addr_t process_address, const Constant *constant)
{
+ bool ResolveVectorConstant(lldb::addr_t process_address,
+ const Constant *constant,
+ lldb_private::ExecutionContext &exe_ctx) {
+ auto *vector_type = dyn_cast<FixedVectorType>(constant->getType());
+ if (!vector_type)
+ return false;
+
+ Type *element_type = vector_type->getElementType();
+ unsigned num_elements = vector_type->getNumElements();
+ size_t element_size = m_target_data.getTypeStoreSize(element_type);
+ size_t total_size = element_size * num_elements;
+ bool reverse_elements = !MemoryMatchesIRElementOrder(exe_ctx);
+
+ lldb_private::DataBufferHeap buf(total_size, 0);
+ uint8_t *data_ptr = buf.GetBytes();
+
+ if (isa<ConstantAggregateZero>(constant)) {
+ // Zero initializer - buffer is already zeroed, just write it
+ lldb_private::Status write_error;
+ m_execution_unit.WriteMemory(process_address, buf.GetBytes(),
+ buf.GetByteSize(), write_error);
+ return write_error.Success();
+ }
+
+ if (const ConstantDataVector *cdv =
+ dyn_cast<ConstantDataVector>(constant)) {
+ for (unsigned i = 0; i < num_elements; ++i) {
+ const Constant *element = cdv->getElementAsConstant(i);
+ APInt element_value;
+ if (!ResolveConstantValue(element_value, element))
+ return false;
+
+ // Calculate target offset based on element ordering
+ unsigned target_index = !reverse_elements ? i : (num_elements - 1 - i);
+ size_t offset = target_index * element_size;
+
+ lldb_private::Scalar element_scalar(
+ element_value.zextOrTrunc(element_size * 8));
+ lldb_private::Status get_data_error;
+ if (!element_scalar.GetAsMemoryData(data_ptr + offset, element_size,
+ m_byte_order, get_data_error))
----------------
Michael137 wrote:
I see we're duplicating some of the code here and in the code that handles
`Instruction::ExtractElement`. Could we re-use some of that indexing logic?
https://github.com/llvm/llvm-project/pull/155000
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits