[Lldb-commits] [PATCH] D16975: Handle floating-point type homogeneous aggregate return values in ABISysV_arm
Muhammad Omair Javaid via lldb-commits
lldb-commits at lists.llvm.org
Thu Feb 11 03:36:04 PST 2016
omjavaid updated this revision to Diff 47625.
omjavaid added a comment.
I have added an else case for unhandled or error cases.
I have added to Todo for handling complex and vector types. ABI document doesnt say much about how complex will be returned so I am doing a bit investigation with how they are being managed by compiler. I will handle them both in next patch.
http://reviews.llvm.org/D16975
Files:
source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp
Index: source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp
===================================================================
--- source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp
+++ source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp
@@ -579,6 +579,82 @@
else if (compiler_type.IsAggregateType())
{
size_t byte_size = compiler_type.GetByteSize(&thread);
+ if (IsArmHardFloat(thread))
+ {
+ CompilerType base_type;
+ const uint32_t homogeneous_count = compiler_type.IsHomogeneousAggregate (&base_type);
+
+ if (homogeneous_count > 0 && homogeneous_count <= 4)
+ {
+ if (base_type.IsFloatingPointType(float_count, is_complex))
+ {
+ if (float_count == 1 && !is_complex)
+ {
+ ProcessSP process_sp (thread.GetProcess());
+ ByteOrder byte_order = process_sp->GetByteOrder();
+
+ DataBufferSP data_sp (new DataBufferHeap(byte_size, 0));
+ const size_t base_byte_size = base_type.GetByteSize(nullptr);
+ uint32_t data_offset = 0;
+
+ for (uint32_t reg_index = 0; reg_index < homogeneous_count; reg_index++)
+ {
+ uint32_t regnum = 0;
+
+ if (base_byte_size == 4)
+ regnum = dwarf_s0 + reg_index;
+ else if (base_byte_size == 8)
+ regnum = dwarf_d0 + reg_index;
+ else
+ break;
+
+ const RegisterInfo *reg_info = reg_ctx->GetRegisterInfo (eRegisterKindDWARF, regnum);
+ if (reg_info == NULL)
+ break;
+
+ RegisterValue reg_value;
+ if (!reg_ctx->ReadRegister(reg_info, reg_value))
+ break;
+
+ // Make sure we have enough room in "data_sp"
+ if ((data_offset + base_byte_size) <= data_sp->GetByteSize())
+ {
+ Error error;
+ const size_t bytes_copied = reg_value.GetAsMemoryData (reg_info,
+ data_sp->GetBytes() + data_offset,
+ base_byte_size,
+ byte_order,
+ error);
+ if (bytes_copied != base_byte_size)
+ break;
+
+ data_offset += bytes_copied;
+ }
+ }
+
+ if (data_offset == byte_size)
+ {
+ DataExtractor data;
+ data.SetByteOrder(byte_order);
+ data.SetAddressByteSize(process_sp->GetAddressByteSize());
+ data.SetData(data_sp);
+
+ return ValueObjectConstResult::Create (&thread, compiler_type, ConstString(""), data);
+ }
+ else
+ { // Some error occurred while getting values from registers
+ return return_valobj_sp;
+ }
+
+ }
+ else
+ { // TODO: Add code to handle complex and vector types.
+ return return_valobj_sp;
+ }
+ }
+ }
+ }
+
if (byte_size <= 4)
{
RegisterValue r0_reg_value;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16975.47625.patch
Type: text/x-patch
Size: 4050 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160211/1fd640e8/attachment-0001.bin>
More information about the lldb-commits
mailing list