[Lldb-commits] [lldb] r270207 - [LLDB][MIPS] Fix floating point handling in case of thread step-out

Tamas Berghammer via lldb-commits lldb-commits at lists.llvm.org
Fri May 20 06:15:59 PDT 2016


I had to revert this CL with rL270214 as it causes a build breakage (see
http://lab.llvm.org:8011/builders/lldb-x86_64-ubuntu-14.04-buildserver/builds/7282)
and makes a false assumption regarding host-target compatibility. Please
see my commit message in http://reviews.llvm.org/rL270214 for more details.

Thanks,
Tamas

On Fri, May 20, 2016 at 1:13 PM Sagar Thakur via lldb-commits <
lldb-commits at lists.llvm.org> wrote:

> Author: slthakur
> Date: Fri May 20 07:07:27 2016
> New Revision: 270207
>
> URL: http://llvm.org/viewvc/llvm-project?rev=270207&view=rev
> Log:
> [LLDB][MIPS] Fix floating point handling in case of thread step-out
>
> Patch by Nitesh Jain.
>
> Summary: These patch fix thread step-out for hard and soft float.
>
> Reviewers: clayborg, bhushan, jaydeep
> Subscribers: mohit.bhakkad, sagar, sdardis
> Differential: D20416
>
> Modified:
>     lldb/trunk/include/lldb/Core/ArchSpec.h
>     lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp
>     lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.h
>     lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp
>     lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.h
>     lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
>
> Modified: lldb/trunk/include/lldb/Core/ArchSpec.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ArchSpec.h?rev=270207&r1=270206&r2=270207&view=diff
>
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/ArchSpec.h (original)
> +++ lldb/trunk/include/lldb/Core/ArchSpec.h Fri May 20 07:07:27 2016
> @@ -75,6 +75,20 @@ public:
>          eMIPSABI_mask       = 0x000ff000
>      };
>
> +    // MIPS Floating point ABI Values
> +    enum MIPS_ABI_FP
> +    {
> +        eMIPS_ABI_FP_ANY     = 0x00000000,
> +        eMIPS_ABI_FP_DOUBLE  = 0x00100000,  // hard float / -mdouble-float
> +        eMIPS_ABI_FP_SINGLE  = 0x00200000,  // hard float / -msingle-float
> +        eMIPS_ABI_FP_SOFT    = 0x00300000,  // soft float
> +        eMIPS_ABI_FP_OLD_64  = 0x00400000,  // -mips32r2 -mfp64
> +        eMIPS_ABI_FP_XX      = 0x00500000,  // -mfpxx
> +        eMIPS_ABI_FP_64      = 0x00600000,  // -mips32r2 -mfp64
> +        eMIPS_ABI_FP_64A     = 0x00700000,  // -mips32r2 -mfp64
> -mno-odd-spreg
> +        eMIPS_ABI_FP_mask    = 0x00700000
> +    };
> +
>      // ARM specific e_flags
>      enum ARMeflags
>      {
>
> 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=270207&r1=270206&r2=270207&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp (original)
> +++ lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp Fri May 20
> 07:07:27 2016
> @@ -397,7 +397,11 @@ ABISysV_mips::GetReturnValueObjectImpl (
>      if (exe_ctx.GetTargetPtr() == nullptr || exe_ctx.GetProcessPtr() ==
> nullptr)
>          return return_valobj_sp;
>
> +    Target *target = exe_ctx.GetTargetPtr();
> +    const ArchSpec target_arch = target->GetArchitecture();
> +    ByteOrder target_byte_order = target_arch.GetByteOrder();
>      value.SetCompilerType(return_compiler_type);
> +    uint32_t fp_flag = target_arch.GetFlags() &
> lldb_private::ArchSpec::eMIPS_ABI_FP_mask;
>
>      RegisterContext *reg_ctx = thread.GetRegisterContext().get();
>      if (!reg_ctx)
> @@ -409,8 +413,7 @@ ABISysV_mips::GetReturnValueObjectImpl (
>
>      // 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_compiler_type.GetBitSize(&thread);
> -
> +    size_t bit_width = return_compiler_type.GetBitSize(&thread);
>      if (return_compiler_type.IsIntegerType (is_signed))
>      {
>          switch (bit_width)
> @@ -467,37 +470,107 @@ ABISysV_mips::GetReturnValueObjectImpl (
>      }
>      else if (return_compiler_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)
> +        if (IsSoftFloat (fp_flag))
>          {
> +            uint64_t raw_value =
> reg_ctx->ReadRegisterAsUnsigned(r2_reg_info, 0);
> +            if (count != 1 && is_complex)
> +                return return_valobj_sp;
>              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);
> +                    value.GetScalar() = *((float *)(&raw_value));
> +                    break;
> +                case 64:
> +                    static_assert(sizeof(double) == sizeof(uint64_t), "");
> +                    const RegisterInfo *r3_reg_info =
> reg_ctx->GetRegisterInfoByName("r3", 0);
> +                    if (target_byte_order == eByteOrderLittle)
> +                        raw_value =
> ((reg_ctx->ReadRegisterAsUnsigned(r3_reg_info, 0)) << 32) | raw_value;
> +                    else
> +                        raw_value = (raw_value << 32) |
> reg_ctx->ReadRegisterAsUnsigned(r3_reg_info, 0);
> +                    value.GetScalar() = *((double *)(&raw_value));
>                      break;
> -                }
>              }
>          }
> +
>          else
>          {
> -            // not handled yet
> -            return return_valobj_sp;
> +            const RegisterInfo *f0_info =
> reg_ctx->GetRegisterInfoByName("f0", 0);
> +            RegisterValue f0_value;
> +            DataExtractor f0_data;
> +            reg_ctx->ReadRegister (f0_info, f0_value);
> +            f0_value.GetData(f0_data);
> +            lldb::offset_t offset = 0;
> +
> +            if (count == 1 && !is_complex)
> +            {
> +                switch (bit_width)
> +                {
> +                    default:
> +                        return return_valobj_sp;
> +                    case 64:
> +                    {
> +                        static_assert(sizeof(double) == sizeof(uint64_t),
> "");
> +                        const RegisterInfo *f1_info =
> reg_ctx->GetRegisterInfoByName("f1", 0);
> +                        RegisterValue f1_value;
> +                        DataExtractor f1_data;
> +                        reg_ctx->ReadRegister (f1_info, f1_value);
> +                        DataExtractor *copy_from_extractor = nullptr;
> +                        DataBufferSP data_sp (new DataBufferHeap(8, 0));
> +                        DataExtractor return_ext (data_sp,
> +                                                  target_byte_order,
> +
> target->GetArchitecture().GetAddressByteSize());
> +
> +                        if (target_byte_order == eByteOrderLittle)
> +                        {
> +                            copy_from_extractor = &f0_data;
> +                            copy_from_extractor->CopyByteOrderedData
> (offset,
> +                                                                      4,
> +
> data_sp->GetBytes(),
> +                                                                      4,
> +
> target_byte_order);
> +                            f1_value.GetData(f1_data);
> +                            copy_from_extractor = &f1_data;
> +                            copy_from_extractor->CopyByteOrderedData
> (offset,
> +                                                                      4,
> +
> data_sp->GetBytes() + 4,
> +                                                                      4,
> +
> target_byte_order);
> +                        }
> +                        else
> +                        {
> +                            copy_from_extractor = &f0_data;
> +                            copy_from_extractor->CopyByteOrderedData
> (offset,
> +                                                                      4,
> +
> data_sp->GetBytes() + 4,
> +                                                                      4,
> +
> target_byte_order);
> +                            f1_value.GetData(f1_data);
> +                            copy_from_extractor = &f1_data;
> +                            copy_from_extractor->CopyByteOrderedData
> (offset,
> +                                                                      4,
> +
> data_sp->GetBytes(),
> +                                                                      4,
> +
> target_byte_order);
> +                        }
> +                        value.GetScalar() = (double)
> return_ext.GetDouble(&offset);
> +                        break;
> +                    }
> +                    case 32:
> +                    {
> +                        static_assert(sizeof(float) == sizeof(uint32_t),
> "");
> +                        value.GetScalar() = (float)
> f0_data.GetFloat(&offset);
> +                        break;
> +                    }
> +                }
> +            }
> +            else
> +            {
> +                // not handled yet
> +                return return_valobj_sp;
> +            }
>          }
>      }
>      else
> @@ -563,6 +636,12 @@ ABISysV_mips::RegisterIsVolatile (const
>  }
>
>  bool
> +ABISysV_mips::IsSoftFloat(uint32_t fp_flags) const
> +{
> +    return (fp_flags == lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT);
> +}
> +
> +bool
>  ABISysV_mips::RegisterIsCalleeSaved (const RegisterInfo *reg_info)
>  {
>      if (reg_info)
>
> Modified: lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.h?rev=270207&r1=270206&r2=270207&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.h (original)
> +++ lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.h Fri May 20
> 07:07:27 2016
> @@ -54,6 +54,9 @@ public:
>      RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info)
> override;
>
>      bool
> +    IsSoftFloat(uint32_t fp_flag) const;
> +
> +    bool
>      CallFrameAddressIsValid(lldb::addr_t cfa) override
>      {
>          // Make sure the stack call frame addresses are 8 byte aligned
>
> 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=270207&r1=270206&r2=270207&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp (original)
> +++ lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp Fri May
> 20 07:07:27 2016
> @@ -372,9 +372,11 @@ ABISysV_mips64::GetReturnValueObjectImpl
>          return return_valobj_sp;
>
>      Target *target = exe_ctx.GetTargetPtr();
> -    ByteOrder target_byte_order =
> target->GetArchitecture().GetByteOrder();
> +    const ArchSpec target_arch = target->GetArchitecture();
> +    ByteOrder target_byte_order = target_arch.GetByteOrder();
>      const size_t byte_size = return_compiler_type.GetByteSize(nullptr);
>      const uint32_t type_flags = return_compiler_type.GetTypeInfo(nullptr);
> +    uint32_t fp_flag = target_arch.GetFlags () &
> lldb_private::ArchSpec::eMIPS_ABI_FP_mask;
>
>      const RegisterInfo *r2_info = reg_ctx->GetRegisterInfoByName("r2", 0);
>      const RegisterInfo *r3_info = reg_ctx->GetRegisterInfoByName("r3", 0);
> @@ -438,20 +440,52 @@ ABISysV_mips64::GetReturnValueObjectImpl
>              {
>                  // Don't handle complex yet.
>              }
> +            else if (IsSoftFloat(fp_flag))
> +            {
> +                uint64_t raw_value =
> reg_ctx->ReadRegisterAsUnsigned(r2_info, 0);
> +                switch (byte_size)
> +                {
> +                    case sizeof(float):
> +                        value.GetScalar() = *((float *)(&raw_value));
> +                        success = true;
> +                        break;
> +                    case sizeof(double):
> +                        value.GetScalar() = *((double *)(&raw_value));
> +                        success = true;
> +                        break;
> +                    case sizeof(long double):
> +                        uint64_t result[2];
> +                        if (target_byte_order == eByteOrderLittle)
> +                        {
> +                            result[0] = raw_value;
> +                            result[1] =
> reg_ctx->ReadRegisterAsUnsigned(r3_info, 0);
> +                            value.GetScalar() = *((long double
> *)(result));
> +                        }
> +                        else
> +                        {
> +                            result[0] =
> reg_ctx->ReadRegisterAsUnsigned(r3_info, 0);
> +                            result[1] = raw_value;
> +                            value.GetScalar() = *((long double
> *)(result));
> +                        }
> +                        success = true;
> +                        break;
> +                }
> +
> +            }
>              else
>              {
>                  if (byte_size <= sizeof(long double))
>                  {
>                      const RegisterInfo *f0_info =
> reg_ctx->GetRegisterInfoByName("f0", 0);
> -                    const RegisterInfo *f2_info =
> reg_ctx->GetRegisterInfoByName("f2", 0);
> -                    RegisterValue f0_value, f2_value;
> -                    DataExtractor f0_data, f2_data;
> +
> +                    RegisterValue f0_value;
> +                    DataExtractor f0_data;
>
>                      reg_ctx->ReadRegister (f0_info, f0_value);
> -                    reg_ctx->ReadRegister (f2_info, f2_value);
> +
>
>                      f0_value.GetData(f0_data);
> -                    f2_value.GetData(f2_data);
> +
>
>                      lldb::offset_t offset = 0;
>                      if (byte_size == sizeof(float))
> @@ -466,6 +500,10 @@ ABISysV_mips64::GetReturnValueObjectImpl
>                      }
>                      else if (byte_size == sizeof(long double))
>                      {
> +                        const RegisterInfo *f2_info =
> reg_ctx->GetRegisterInfoByName("f2", 0);
> +                        RegisterValue  f2_value;
> +                        DataExtractor f2_data;
> +                        reg_ctx->ReadRegister (f2_info, f2_value);
>                          DataExtractor *copy_from_extractor = nullptr;
>                          DataBufferSP data_sp (new DataBufferHeap(16, 0));
>                          DataExtractor return_ext (data_sp,
> @@ -474,21 +512,37 @@ ABISysV_mips64::GetReturnValueObjectImpl
>
>                          if (target_byte_order == eByteOrderLittle)
>                          {
> -                             f0_data.Append(f2_data);
>                               copy_from_extractor = &f0_data;
> +                             copy_from_extractor->CopyByteOrderedData (0,
> +                                                                       8,
> +
>  data_sp->GetBytes(),
> +
>  byte_size - 8,
> +
>  target_byte_order);
> +                             f2_value.GetData(f2_data);
> +                             copy_from_extractor = &f2_data;
> +                             copy_from_extractor->CopyByteOrderedData (0,
> +                                                                       8,
> +
>  data_sp->GetBytes() + 8,
> +
>  byte_size - 8,
> +
>  target_byte_order);
>                          }
>                          else
>                          {
> -                            f2_data.Append(f0_data);
> -                            copy_from_extractor = &f2_data;
> +                            copy_from_extractor = &f0_data;
> +                            copy_from_extractor->CopyByteOrderedData (0,
> +                                                                      8,
> +
> data_sp->GetBytes() + 8,
> +
> byte_size - 8,
> +
> target_byte_order);
> +                           f2_value.GetData(f2_data);
> +                           copy_from_extractor = &f2_data;
> +                           copy_from_extractor->CopyByteOrderedData (0,
> +                                                                     8,
> +
>  data_sp->GetBytes(),
> +
>  byte_size - 8,
> +
>  target_byte_order);
>                          }
>
> -                        copy_from_extractor->CopyByteOrderedData (0,
> -
> byte_size,
> -
> data_sp->GetBytes(),
> -
> byte_size,
> -
> target_byte_order);
> -
>                          return_valobj_sp = ValueObjectConstResult::Create
> (&thread,
>
>   return_compiler_type,
>
>   ConstString(""),
> @@ -780,6 +834,12 @@ ABISysV_mips64::RegisterIsVolatile (cons
>  }
>
>  bool
> +ABISysV_mips64::IsSoftFloat (uint32_t fp_flag) const
> +{
> +    return (fp_flag == lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT);
> +}
> +
> +bool
>  ABISysV_mips64::RegisterIsCalleeSaved (const RegisterInfo *reg_info)
>  {
>      if (reg_info)
>
> Modified: lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.h
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.h?rev=270207&r1=270206&r2=270207&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.h (original)
> +++ lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.h Fri May 20
> 07:07:27 2016
> @@ -53,6 +53,9 @@ public:
>      bool
>      RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info)
> override;
>
> +    bool
> +    IsSoftFloat(uint32_t fp_flag) const;
> +
>      // The SysV mips ABI requires that stack frames be 16 byte aligned.
>      // When there is a trap handler on the stack, e.g. _sigtramp in
> userland
>      // code, we've seen that the stack pointer is often not aligned
> properly
>
> Modified: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp?rev=270207&r1=270206&r2=270207&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (original)
> +++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp Fri May 20
> 07:07:27 2016
> @@ -33,6 +33,7 @@
>  #include "llvm/ADT/StringRef.h"
>  #include "llvm/Support/ARMBuildAttributes.h"
>  #include "llvm/Support/MathExtras.h"
> +#include "llvm/Support/MipsABIFlags.h"
>
>  #define CASE_AND_STREAM(s, def, width)                  \
>      case def: s->Printf("%-*s", width, #def); break;
> @@ -1706,8 +1707,39 @@ ObjectFileELF::GetSectionHeaderInfo(Sect
>
>                          if (section_size && (set_data (data,
> sheader.sh_offset, section_size) == section_size))
>                          {
> -                            lldb::offset_t ase_offset = 12; // MIPS ABI
> Flags Version: 0
> -                            arch_flags |= data.GetU32 (&ase_offset);
> +                            // MIPS ASE Mask is at offset 12 in
> MIPS.abiflags section
> +                            lldb::offset_t offset = 12; // MIPS ABI Flags
> Version: 0
> +                            arch_flags |= data.GetU32 (&offset);
> +
> +                            // The floating point ABI is at offset 7
> +                            offset = 7;
> +                            switch (data.GetU8 (&offset))
> +                            {
> +                                case llvm::Mips::Val_GNU_MIPS_ABI_FP_ANY :
> +                                    arch_flags |=
> lldb_private::ArchSpec::eMIPS_ABI_FP_ANY;
> +                                    break;
> +                                case
> llvm::Mips::Val_GNU_MIPS_ABI_FP_DOUBLE :
> +                                    arch_flags |=
> lldb_private::ArchSpec::eMIPS_ABI_FP_DOUBLE;
> +                                    break;
> +                                case
> llvm::Mips::Val_GNU_MIPS_ABI_FP_SINGLE :
> +                                    arch_flags |=
> lldb_private::ArchSpec::eMIPS_ABI_FP_SINGLE;
> +                                    break;
> +                                case llvm::Mips::Val_GNU_MIPS_ABI_FP_SOFT
> :
> +                                    arch_flags |=
> lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT;
> +                                    break;
> +                                case
> llvm::Mips::Val_GNU_MIPS_ABI_FP_OLD_64 :
> +                                    arch_flags |=
> lldb_private::ArchSpec::eMIPS_ABI_FP_OLD_64;
> +                                    break;
> +                                case llvm::Mips::Val_GNU_MIPS_ABI_FP_XX :
> +                                    arch_flags |=
> lldb_private::ArchSpec::eMIPS_ABI_FP_XX;
> +                                    break;
> +                                case llvm::Mips::Val_GNU_MIPS_ABI_FP_64 :
> +                                    arch_flags |=
> lldb_private::ArchSpec::eMIPS_ABI_FP_64;
> +                                    break;
> +                                case llvm::Mips::Val_GNU_MIPS_ABI_FP_64A :
> +                                    arch_flags |=
> lldb_private::ArchSpec::eMIPS_ABI_FP_64A;
> +                                    break;
> +                            }
>                          }
>                      }
>                      // Settings appropriate ArchSpec ABI Flags
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160520/3a256dcb/attachment-0001.html>


More information about the lldb-commits mailing list