[Lldb-commits] [lldb] r283729 - [LLDB][MIPS] Fix TestReturnValue failure for MIPS

Nitesh Jain via lldb-commits lldb-commits at lists.llvm.org
Mon Oct 10 02:16:21 PDT 2016


Author: nitesh.jain
Date: Mon Oct 10 04:16:20 2016
New Revision: 283729

URL: http://llvm.org/viewvc/llvm-project?rev=283729&view=rev
Log:
[LLDB][MIPS] Fix TestReturnValue failure for MIPS

Reviewers: clayborg, labath, bhushan

Subscribers: jaydeep, slthakur, llvm-commits

Differential Revision: https://reviews.llvm.org/D24498

Modified:
    lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp

Modified: lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp?rev=283729&r1=283728&r2=283729&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp (original)
+++ lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp Mon Oct 10 04:16:20 2016
@@ -923,23 +923,26 @@ ValueObjectSP ABISysV_mips64::GetReturnV
                                target->GetArchitecture().GetAddressByteSize());
 
       RegisterValue r2_value, r3_value, f0_value, f1_value, f2_value;
+      // Tracks how much bytes of r2 and r3 registers we've consumed so far
+      uint32_t integer_bytes = 0;
 
-      uint32_t integer_bytes = 0; // Tracks how much bytes of r2 and r3
-                                  // registers we've consumed so far
-      bool use_fp_regs = 0; // True if return values are in FP return registers.
-      bool found_non_fp_field =
-          0; // True if we found any non floating point field in structure.
-      bool use_r2 = 0; // True if return values are in r2 register.
-      bool use_r3 = 0; // True if return values are in r3 register.
-      bool sucess = 0; // True if the result is copied into our data buffer
+      // True if return values are in FP return registers.
+      bool use_fp_regs = 0;
+      // True if we found any non floating point field in structure.
+      bool found_non_fp_field = 0;
+      // True if return values are in r2 register.
+      bool use_r2 = 0;
+      // True if return values are in r3 register.
+      bool use_r3 = 0;
+      // True if the result is copied into our data buffer
+      bool sucess = 0;
       std::string name;
       bool is_complex;
       uint32_t count;
       const uint32_t num_children = return_compiler_type.GetNumFields();
 
       // A structure consisting of one or two FP values (and nothing else) will
-      // be
-      // returned in the two FP return-value registers i.e fp0 and fp2.
+      // be returned in the two FP return-value registers i.e fp0 and fp2.
       if (num_children <= 2) {
         uint64_t field_bit_offset = 0;
 
@@ -967,7 +970,6 @@ ValueObjectSP ABISysV_mips64::GetReturnV
           reg_ctx->ReadRegister(f2_info, f2_value);
 
           f0_value.GetData(f0_data);
-          f2_value.GetData(f2_data);
 
           for (uint32_t idx = 0; idx < num_children; idx++) {
             CompilerType field_compiler_type =
@@ -977,30 +979,40 @@ ValueObjectSP ABISysV_mips64::GetReturnV
                 field_compiler_type.GetByteSize(nullptr);
 
             DataExtractor *copy_from_extractor = nullptr;
+            uint64_t return_value[2];
+            offset_t offset = 0;
 
             if (idx == 0) {
-              if (field_byte_width == 16) // This case is for long double type.
-              {
+              // This case is for long double type.
+              if (field_byte_width == 16) {
+
                 // If structure contains long double type, then it is returned
                 // in fp0/fp1 registers.
-                reg_ctx->ReadRegister(f1_info, f1_value);
-                f1_value.GetData(f1_data);
-
                 if (target_byte_order == eByteOrderLittle) {
-                  f0_data.Append(f1_data);
-                  copy_from_extractor = &f0_data;
+                  return_value[0] = f0_data.GetU64(&offset);
+                  reg_ctx->ReadRegister(f1_info, f1_value);
+                  f1_value.GetData(f1_data);
+                  offset = 0;
+                  return_value[1] = f1_data.GetU64(&offset);
                 } else {
-                  f1_data.Append(f0_data);
-                  copy_from_extractor = &f1_data;
+                  return_value[1] = f0_data.GetU64(&offset);
+                  reg_ctx->ReadRegister(f1_info, f1_value);
+                  f1_value.GetData(f1_data);
+                  offset = 0;
+                  return_value[0] = f1_data.GetU64(&offset);
                 }
-              } else
-                copy_from_extractor = &f0_data; // This is in f0, copy from
-                                                // register to our result
-                                                // structure
-            } else
-              copy_from_extractor = &f2_data; // This is in f2, copy from
+
+                f0_data.SetData(return_value, field_byte_width,
+                                target_byte_order);
+              }
+              copy_from_extractor = &f0_data; // This is in f0, copy from
                                               // register to our result
                                               // structure
+            } else {
+              f2_value.GetData(f2_data);
+              // This is in f2, copy from register to our result structure
+              copy_from_extractor = &f2_data;
+            }
 
             // Sanity check to avoid crash
             if (!copy_from_extractor ||




More information about the lldb-commits mailing list