[Lldb-commits] [lldb] r245020 - [MIPS]Handle floating point and aggregate return types in SysV-mips [32 bit] ABI

Hans Wennborg via lldb-commits lldb-commits at lists.llvm.org
Tue Aug 18 15:02:55 PDT 2015


Greg: ping?

On Fri, Aug 14, 2015 at 11:06 AM, Hans Wennborg <hans at chromium.org> wrote:
> Sure, if Greg approves.
>
> Thanks,
> Hans
>
> On Thu, Aug 13, 2015 at 11:25 PM, Bhushan Attarde
> <Bhushan.Attarde at imgtec.com> wrote:
>> Hi Hans,
>>
>> Could you please merge this to the release branch?
>>
>> Thanks
>> Bhushan
>>
>>
>> -----Original Message-----
>> From: lldb-commits [mailto:lldb-commits-bounces at lists.llvm.org] On Behalf Of Bhushan D. Attarde via lldb-commits
>> Sent: 14 August 2015 09:11
>> To: lldb-commits at lists.llvm.org
>> Subject: [Lldb-commits] [lldb] r245020 - [MIPS]Handle floating point and aggregate return types in SysV-mips [32 bit] ABI
>>
>> Author: bhushan.attarde
>> Date: Thu Aug 13 22:40:31 2015
>> New Revision: 245020
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=245020&view=rev
>> Log:
>> [MIPS]Handle floating point and aggregate return types in SysV-mips [32 bit] ABI
>>
>>     SUMMARY:
>>     This patch adds support of floating point and aggregate return types in GetReturnValueObjectImpl() for mips32
>>
>>     Reviewers: clayborg
>>     Subscribers: mohit.bhakkad,  nitesh.jain, sagar, jaydeep, lldb-commits
>>     Differential Revision: http://reviews.llvm.org/D11930
>>
>> Modified:
>>     lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp
>>
>> Modified: lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp?rev=245020&r1=245019&r2=245020&view=diff
>> ==============================================================================
>> --- lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp (original)
>> +++ lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp Thu Aug 13 22:40:31 2015
>> @@ -423,15 +423,16 @@ ABISysV_mips::GetReturnValueObjectImpl (
>>      if (!reg_ctx)
>>          return return_valobj_sp;
>>
>> -    bool is_signed;
>> +    bool is_signed = false;
>> +    bool is_complex = false;
>> +    uint32_t count = 0;
>>
>>      // In MIPS register "r2" (v0) holds the integer function return values
>>      const RegisterInfo *r2_reg_info = reg_ctx->GetRegisterInfoByName("r2", 0);
>> +    size_t bit_width = return_clang_type.GetBitSize(&thread);
>>
>>      if (return_clang_type.IsIntegerType (is_signed))
>>      {
>> -        size_t bit_width = return_clang_type.GetBitSize(&thread);
>> -
>>          switch (bit_width)
>>          {
>>              default:
>> @@ -473,6 +474,52 @@ ABISysV_mips::GetReturnValueObjectImpl (
>>          uint32_t ptr = thread.GetRegisterContext()->ReadRegisterAsUnsigned(r2_reg_info, 0) & UINT32_MAX;
>>          value.GetScalar() = ptr;
>>      }
>> +    else if (return_clang_type.IsAggregateType ())
>> +    {
>> +        // Structure/Vector is always passed in memory and pointer to that memory is passed in r2.
>> +        uint64_t mem_address = reg_ctx->ReadRegisterAsUnsigned(reg_ctx->GetRegisterInfoByName("r2", 0), 0);
>> +        // We have got the address. Create a memory object out of it
>> +        return_valobj_sp = ValueObjectMemory::Create (&thread,
>> +                                                      "",
>> +                                                      Address (mem_address, NULL),
>> +                                                      return_clang_type);
>> +        return return_valobj_sp;
>> +    }
>> +    else if (return_clang_type.IsFloatingPointType (count, is_complex))
>> +    {
>> +        const RegisterInfo *f0_info = reg_ctx->GetRegisterInfoByName("f0", 0);
>> +        const RegisterInfo *f1_info = reg_ctx->GetRegisterInfoByName("f1", 0);
>> +
>> +        if (count == 1 && !is_complex)
>> +        {
>> +            switch (bit_width)
>> +            {
>> +                default:
>> +                    return return_valobj_sp;
>> +                case 64:
>> +                {
>> +                    static_assert(sizeof(double) == sizeof(uint64_t), "");
>> +                    uint64_t raw_value;
>> +                    raw_value = reg_ctx->ReadRegisterAsUnsigned(f0_info, 0) & UINT32_MAX;
>> +                    raw_value |= ((uint64_t)(reg_ctx->ReadRegisterAsUnsigned(f1_info, 0) & UINT32_MAX)) << 32;
>> +                    value.GetScalar() = *reinterpret_cast<double*>(&raw_value);
>> +                    break;
>> +                }
>> +                case 32:
>> +                {
>> +                    static_assert(sizeof(float) == sizeof(uint32_t), "");
>> +                    uint32_t raw_value = reg_ctx->ReadRegisterAsUnsigned(f0_info, 0) & UINT32_MAX;
>> +                    value.GetScalar() = *reinterpret_cast<float*>(&raw_value);
>> +                    break;
>> +                }
>> +            }
>> +        }
>> +        else
>> +        {
>> +            // not handled yet
>> +            return return_valobj_sp;
>> +        }
>> +    }
>>      else
>>      {
>>          // not handled yet
>>
>>
>> _______________________________________________
>> lldb-commits mailing list
>> lldb-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


More information about the lldb-commits mailing list