[Lldb-commits] [lldb] r242903 - Improve SysV ABI for ARM to handle return values with vector return type

Tamas Berghammer tberghammer at google.com
Wed Jul 22 07:53:37 PDT 2015


Author: tberghammer
Date: Wed Jul 22 09:53:37 2015
New Revision: 242903

URL: http://llvm.org/viewvc/llvm-project?rev=242903&view=rev
Log:
Improve SysV ABI for ARM to handle return values with vector return type

This is required to print out the rerun value of funcions returning
types with the following attributes:
__attribute__((__vector_size__(8)));
__attribute__((ext_vector_type(2)));

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

Modified:
    lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp
    lldb/trunk/test/functionalities/return-value/TestReturnValue.py
    lldb/trunk/test/functionalities/return-value/call-func.c

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=242903&r1=242902&r2=242903&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp (original)
+++ lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp Wed Jul 22 09:53:37 2015
@@ -398,6 +398,23 @@ ABISysV_arm::GetArgumentValues (Thread &
     return true;
 }
 
+static bool
+GetReturnValuePassedInMemory(Thread &thread, RegisterContext* reg_ctx, size_t byte_size, Value& value)
+{
+    Error error;
+    DataBufferHeap buffer(byte_size, 0);
+
+    const RegisterInfo *r0_reg_info = reg_ctx->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);
+    uint32_t address = reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;
+    thread.GetProcess()->ReadMemory(address, buffer.GetBytes(), buffer.GetByteSize(), error);
+
+    if (error.Fail())
+        return false;
+
+    value.SetBytes(buffer.GetBytes(), buffer.GetByteSize());
+    return true;
+}
+
 ValueObjectSP
 ABISysV_arm::GetReturnValueObjectImpl (Thread &thread,
                                        lldb_private::ClangASTType &clang_type) const
@@ -472,6 +489,27 @@ ABISysV_arm::GetReturnValueObjectImpl (T
         uint32_t ptr = thread.GetRegisterContext()->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;
         value.GetScalar() = ptr;
     }
+    else if (clang_type.IsVectorType(nullptr, nullptr))
+    {
+        size_t byte_size = clang_type.GetByteSize(&thread);
+        if (byte_size <= 16)
+        {
+            DataBufferHeap buffer(16, 0);
+            uint32_t* buffer_ptr = (uint32_t*)buffer.GetBytes();
+            
+            for (uint32_t i = 0; 4*i < byte_size; ++i)
+            {
+                const RegisterInfo *reg_info = reg_ctx->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + i);
+                buffer_ptr[i] = reg_ctx->ReadRegisterAsUnsigned(reg_info, 0) & UINT32_MAX;
+            }
+            value.SetBytes(buffer.GetBytes(), byte_size);
+        }
+        else
+        {
+            if (!GetReturnValuePassedInMemory(thread, reg_ctx, byte_size, value))
+                return return_valobj_sp;
+        }
+    }
     else if (clang_type.IsFloatingPointType(float_count, is_complex))
     {
         if (float_count == 1 && !is_complex)
@@ -517,16 +555,7 @@ ABISysV_arm::GetReturnValueObjectImpl (T
         }
         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
+            if (!GetReturnValuePassedInMemory(thread, reg_ctx, byte_size, value))
                 return return_valobj_sp;
         }
     }

Modified: lldb/trunk/test/functionalities/return-value/TestReturnValue.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/return-value/TestReturnValue.py?rev=242903&r1=242902&r2=242903&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/return-value/TestReturnValue.py (original)
+++ lldb/trunk/test/functionalities/return-value/TestReturnValue.py Wed Jul 22 09:53:37 2015
@@ -81,7 +81,7 @@ class ReturnValueTestCase(TestBase):
             in_child_str = in_child.GetValue()
             ret_child_str = ret_child.GetValue()
 
-            self.assertTrue (in_child_str == ret_child_str)
+            self.assertEqual(in_child_str, ret_child_str)
 
     def do_return_value(self):
         """Test getting return values from stepping out."""
@@ -213,10 +213,13 @@ class ReturnValueTestCase(TestBase):
 
         # icc and gcc don't support this extension.
         if self.getCompiler().endswith('clang'):
-            self.return_and_test_struct_value ("return_vector_size_float32")
-            self.return_and_test_struct_value ("return_ext_vector_size_float32")
+            self.return_and_test_struct_value ("return_vector_size_float32_8")
+            self.return_and_test_struct_value ("return_vector_size_float32_16")
+            self.return_and_test_struct_value ("return_vector_size_float32_32")
+            self.return_and_test_struct_value ("return_ext_vector_size_float32_2")
+            self.return_and_test_struct_value ("return_ext_vector_size_float32_4")
+            self.return_and_test_struct_value ("return_ext_vector_size_float32_8")
 
-        
 if __name__ == '__main__':
     import atexit
     lldb.SBDebugger.Initialize()

Modified: lldb/trunk/test/functionalities/return-value/call-func.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/return-value/call-func.c?rev=242903&r1=242902&r2=242903&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/return-value/call-func.c (original)
+++ lldb/trunk/test/functionalities/return-value/call-func.c Wed Jul 22 09:53:37 2015
@@ -301,17 +301,46 @@ return_one_int_one_pointer (struct one_i
   return value;
 }
 
-typedef float vector_size_float32 __attribute__((__vector_size__(16)));
-typedef float ext_vector_size_float32 __attribute__((ext_vector_type(4)));
+typedef float vector_size_float32_8 __attribute__((__vector_size__(8)));
+typedef float vector_size_float32_16 __attribute__((__vector_size__(16)));
+typedef float vector_size_float32_32 __attribute__((__vector_size__(32)));
+
+typedef float ext_vector_size_float32_2 __attribute__((ext_vector_type(2)));
+typedef float ext_vector_size_float32_4 __attribute__((ext_vector_type(4)));
+typedef float ext_vector_size_float32_8 __attribute__((ext_vector_type(8)));
 
-vector_size_float32
-return_vector_size_float32 (vector_size_float32 value)
+vector_size_float32_8
+return_vector_size_float32_8 (vector_size_float32_8 value)
 {
     return value;
 }
 
-ext_vector_size_float32
-return_ext_vector_size_float32 (ext_vector_size_float32 value)
+vector_size_float32_16
+return_vector_size_float32_16 (vector_size_float32_16 value)
+{
+    return value;
+}
+
+vector_size_float32_32
+return_vector_size_float32_32 (vector_size_float32_32 value)
+{
+    return value;
+}
+
+ext_vector_size_float32_2
+return_ext_vector_size_float32_2 (ext_vector_size_float32_2 value)
+{
+    return value;
+}
+
+ext_vector_size_float32_4
+return_ext_vector_size_float32_4 (ext_vector_size_float32_4 value)
+{
+    return value;
+}
+
+ext_vector_size_float32_8
+return_ext_vector_size_float32_8 (ext_vector_size_float32_8 value)
 {
     return value;
 }
@@ -366,9 +395,13 @@ main ()
   return_one_int_one_double_packed ((struct one_int_one_double_packed) {10, 20.0});
   return_one_int_one_long ((struct one_int_one_long) {10, 20});
 
-  return_vector_size_float32 (( vector_size_float32 ){1.5, 2.25, 4.125, 8.0625});
-  return_ext_vector_size_float32 ((ext_vector_size_float32){ 16.5, 32.25, 64.125, 128.0625});
-  
-  return 0;
-  
+  return_vector_size_float32_8 (( vector_size_float32_8 ){1.5, 2.25});
+  return_vector_size_float32_16 (( vector_size_float32_16 ){1.5, 2.25, 4.125, 8.0625});
+  return_vector_size_float32_32 (( vector_size_float32_32 ){1.5, 2.25, 4.125, 8.0625, 7.89, 8.52, 6.31, 9.12});
+
+  return_ext_vector_size_float32_2 ((ext_vector_size_float32_2){ 16.5, 32.25});
+  return_ext_vector_size_float32_4 ((ext_vector_size_float32_4){ 16.5, 32.25, 64.125, 128.0625});
+  return_ext_vector_size_float32_8 ((ext_vector_size_float32_8){ 16.5, 32.25, 64.125, 128.0625, 1.59, 3.57, 8.63, 9.12 });
+
+  return 0; 
 }





More information about the lldb-commits mailing list