[Lldb-commits] [lldb] r254499 - PTRACE ABI to read FXSAVE area for 32-bit inferior

Tamas Berghammer via lldb-commits lldb-commits at lists.llvm.org
Wed Dec 2 05:40:37 PST 2015


Hi Abhishek,

After this change TestReturnValue.py is failing on Linux with i386 inferior
when compiling the inferior with clang-3.5 (it passes with gcc and with ToT
clang). I marked the test XFAIL for that specific configuration to get the
buildbot green but can you take a look?

My suspicion is that clang 3.5 and 3.6 uses an incorrect ABI for returning
small structs from functions (returning it in register instead of in memory
pointed by a register) what causing the issue but I am not certain.

Thanks,
Tamas

On Wed, Dec 2, 2015 at 9:43 AM Abhishek Aggarwal via lldb-commits <
lldb-commits at lists.llvm.org> wrote:

> Author: abhishek
> Date: Wed Dec  2 03:40:17 2015
> New Revision: 254499
>
> URL: http://llvm.org/viewvc/llvm-project?rev=254499&view=rev
> Log:
> PTRACE ABI to read FXSAVE area for 32-bit inferior
>
> Summary:
>  - Problem occurs when:
>     -- 32-bit inferiors run on x86_32 machine and
>        the architecture doesn't have AVX feature
>
>     -- This causes FPRType to be set to eFPRTypeFXSAVE
>
>     -- PTRACE_GETFPREGS was being used to read FXSAVE area
>
>     -- For 32-bit inferiors running on x86_32 machine,
>        PTRACE_GETFPREGS reads FSAVE area and not FXSAVE area
>
>  - Changed ptrace API to PTRACE_GETREGSET for 32-bit inferiors
>     -- This reads FPR data in FXSAVE format.
>     -- For 64-bit inferiors, no change has been made.
>
>  - Modified XFAIL for TestReturnValue.py
>     -- Earlier, this test was passing for Linux OS
>     -- Now, it passes for Android OS as well
>
> Change-Id: Ieed72bc969b79516fc7b263b32493aa1e7a1a2ac
> Signed-off-by: Abhishek Aggarwal <abhishek.a.aggarwal at intel.com>
>
> Reviewers: ovyalov, jingham, lldb-commits, tberghammer, labath
>
> Subscribers: jevinskie, labath, tberghammer, danalbert
>
> Differential Revision: http://reviews.llvm.org/D15042
>
> Modified:
>
> lldb/trunk/packages/Python/lldbsuite/test/functionalities/return-value/TestReturnValue.py
>
> lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp
>
> Modified:
> lldb/trunk/packages/Python/lldbsuite/test/functionalities/return-value/TestReturnValue.py
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/return-value/TestReturnValue.py?rev=254499&r1=254498&r2=254499&view=diff
>
> ==============================================================================
> ---
> lldb/trunk/packages/Python/lldbsuite/test/functionalities/return-value/TestReturnValue.py
> (original)
> +++
> lldb/trunk/packages/Python/lldbsuite/test/functionalities/return-value/TestReturnValue.py
> Wed Dec  2 03:40:17 2015
> @@ -16,7 +16,7 @@ class ReturnValueTestCase(TestBase):
>
>      mydir = TestBase.compute_mydir(__file__)
>
> -    @expectedFailurei386
> +    @expectedFailureAll(oslist=["macosx","freebsd"], archs=["i386"])
>      @expectedFailureWindows("llvm.org/pr24778")
>      @add_test_categories(['pyapi'])
>      def test_with_python(self):
>
> Modified:
> lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp?rev=254499&r1=254498&r2=254499&view=diff
>
> ==============================================================================
> ---
> lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp
> (original)
> +++
> lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp
> Wed Dec  2 03:40:17 2015
> @@ -327,6 +327,9 @@ namespace
>  #ifndef NT_X86_XSTATE
>  #define NT_X86_XSTATE 0x202
>  #endif
> +#ifndef NT_PRXFPREG
> +#define NT_PRXFPREG 0x46e62b7f
> +#endif
>
>  NativeRegisterContextLinux*
>  NativeRegisterContextLinux::CreateHostNativeRegisterContextLinux(const
> ArchSpec& target_arch,
> @@ -832,6 +835,7 @@ NativeRegisterContextLinux_x86_64::IsGPR
>  NativeRegisterContextLinux_x86_64::FPRType
>  NativeRegisterContextLinux_x86_64::GetFPRType () const
>  {
> +    Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
>      if (m_fpr_type == eFPRTypeNotValid)
>      {
>          // TODO: Use assembly to call cpuid on the inferior and query ebx
> or ecx.
> @@ -842,9 +846,15 @@ NativeRegisterContextLinux_x86_64::GetFP
>          {
>              // Fall back to general floating point with no AVX support.
>              m_fpr_type = eFPRTypeFXSAVE;
> +
> +            // Check if FXSAVE area can be read.
> +            if
> (const_cast<NativeRegisterContextLinux_x86_64*>(this)->ReadFPR().Fail())
> +            {
> +                if (log)
> +                    log->Printf("NativeRegisterContextLinux_x86_64::%s
> ptrace APIs failed to read XSAVE/FXSAVE area", __FUNCTION__);
> +            }
>          }
>      }
> -
>      return m_fpr_type;
>  }
>
> @@ -868,10 +878,24 @@ Error
>  NativeRegisterContextLinux_x86_64::WriteFPR()
>  {
>      const FPRType fpr_type = GetFPRType ();
> +    const lldb_private::ArchSpec& target_arch =
> GetRegisterInfoInterface().GetTargetArchitecture();
>      switch (fpr_type)
>      {
>      case FPRType::eFPRTypeFXSAVE:
> -        return NativeRegisterContextLinux::WriteFPR();
> +        // For 32-bit inferiors on x86_32/x86_64 architectures,
> +        // FXSAVE area can be written using PTRACE_SETREGSET ptrace api
> +        // For 64-bit inferiors on x86_64 architectures,
> +        // FXSAVE area can be written using PTRACE_SETFPREGS ptrace api
> +        switch (target_arch.GetMachine ())
> +        {
> +            case llvm::Triple::x86:
> +                return WriteRegisterSet(&m_iovec,
> sizeof(m_fpr.xstate.xsave), NT_PRXFPREG);
> +            case llvm::Triple::x86_64:
> +                return NativeRegisterContextLinux::WriteFPR();
> +            default:
> +                assert(false && "Unhandled target architecture.");
> +                break;
> +        }
>      case FPRType::eFPRTypeXSAVE:
>          return WriteRegisterSet(&m_iovec, sizeof(m_fpr.xstate.xsave),
> NT_X86_XSTATE);
>      default:
> @@ -980,10 +1004,24 @@ Error
>  NativeRegisterContextLinux_x86_64::ReadFPR ()
>  {
>      const FPRType fpr_type = GetFPRType ();
> +    const lldb_private::ArchSpec& target_arch =
> GetRegisterInfoInterface().GetTargetArchitecture();
>      switch (fpr_type)
>      {
>      case FPRType::eFPRTypeFXSAVE:
> -        return NativeRegisterContextLinux::ReadFPR();
> +        // For 32-bit inferiors on x86_32/x86_64 architectures,
> +        // FXSAVE area can be read using PTRACE_GETREGSET ptrace api
> +        // For 64-bit inferiors on x86_64 architectures,
> +        // FXSAVE area can be read using PTRACE_GETFPREGS ptrace api
> +        switch (target_arch.GetMachine ())
> +        {
> +            case llvm::Triple::x86:
> +                return ReadRegisterSet(&m_iovec,
> sizeof(m_fpr.xstate.xsave), NT_PRXFPREG);
> +            case llvm::Triple::x86_64:
> +                return NativeRegisterContextLinux::ReadFPR();
> +            default:
> +                assert(false && "Unhandled target architecture.");
> +                break;
> +        }
>      case FPRType::eFPRTypeXSAVE:
>          return ReadRegisterSet(&m_iovec, sizeof(m_fpr.xstate.xsave),
> NT_X86_XSTATE);
>      default:
>
>
> _______________________________________________
> 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/20151202/b81ac707/attachment.html>


More information about the lldb-commits mailing list