[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