[Lldb-commits] [lldb] r237901 - Handle aggregate return types in SysV-arm ABI

Tamas Berghammer tberghammer at google.com
Thu May 21 06:44:40 PDT 2015


Author: tberghammer
Date: Thu May 21 08:44:40 2015
New Revision: 237901

URL: http://llvm.org/viewvc/llvm-project?rev=237901&view=rev
Log:
Handle aggregate return types in SysV-arm ABI

Differential revision: http://reviews.llvm.org/D9910

Modified:
    lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp

Modified: lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp?rev=237901&r1=237900&r2=237901&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp (original)
+++ lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp Thu May 21 08:44:40 2015
@@ -400,7 +400,7 @@ ABISysV_arm::GetArgumentValues (Thread &
 
 ValueObjectSP
 ABISysV_arm::GetReturnValueObjectImpl (Thread &thread,
-                                         lldb_private::ClangASTType &clang_type) const
+                                       lldb_private::ClangASTType &clang_type) const
 {
     Value value;
     ValueObjectSP return_valobj_sp;
@@ -427,10 +427,10 @@ ABISysV_arm::GetReturnValueObjectImpl (T
     // when reading data
     
     const RegisterInfo *r0_reg_info = reg_ctx->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);
+    size_t bit_width = clang_type.GetBitSize(&thread);
+
     if (clang_type.IsIntegerType (is_signed))
-    {
-        size_t bit_width = clang_type.GetBitSize(&thread);
-        
+    {       
         switch (bit_width)
         {
             default:
@@ -476,7 +476,6 @@ ABISysV_arm::GetReturnValueObjectImpl (T
     {
         if (float_count == 1 && !is_complex)
         {
-            size_t bit_width = clang_type.GetBitSize(&thread);
             switch (bit_width)
             {
                 default:
@@ -507,6 +506,30 @@ ABISysV_arm::GetReturnValueObjectImpl (T
             return return_valobj_sp;
         }
     }
+    else if (clang_type.IsAggregateType())
+    {
+        size_t byte_size = clang_type.GetByteSize(&thread);
+        if (byte_size <= 4)
+        {
+            RegisterValue r0_reg_value;
+            uint32_t raw_value = reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;
+            value.SetBytes(&raw_value, byte_size);
+        }
+        else
+        {
+            RegisterValue r0_reg_value;
+            uint32_t address = reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;
+
+            Error error;
+            DataBufferHeap buffer(byte_size, 0);
+            thread.GetProcess()->ReadMemory(address, buffer.GetBytes(), buffer.GetByteSize(), error);
+
+            if (error.Success())
+                value.SetBytes(buffer.GetBytes(), buffer.GetByteSize());
+            else
+                return return_valobj_sp;
+        }
+    }
     else
     {
         // not handled yet





More information about the lldb-commits mailing list