[Lldb-commits] [lldb] r201637 - Re-apply r201292. We're not going to enforce proper stack frame alignment on i386/x86_64
Jason Molenda
jmolenda at apple.com
Tue Feb 18 19:42:20 PST 2014
Author: jmolenda
Date: Tue Feb 18 21:42:19 2014
New Revision: 201637
URL: http://llvm.org/viewvc/llvm-project?rev=201637&view=rev
Log:
Re-apply r201292. We're not going to enforce proper stack frame alignment on i386/x86_64
because there are too many trap handlers that will have an improperly aligned caller sp
and this will cause the unwinder to stop too early.
Modified:
lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp
lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h
lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h
Modified: lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp?rev=201637&r1=201636&r2=201637&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp (original)
+++ lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp Tue Feb 18 21:42:19 2014
@@ -235,22 +235,12 @@ ABIMacOSX_i386::GetRedZoneSize () const
ABISP
ABIMacOSX_i386::CreateInstance (const ArchSpec &arch)
{
- static ABISP g_abi_mac_sp;
- static ABISP g_abi_other_sp;
- if (arch.GetTriple().getArch() == llvm::Triple::x86)
- {
- if (arch.GetTriple().isOSDarwin())
- {
- if (!g_abi_mac_sp)
- g_abi_mac_sp.reset (new ABIMacOSX_i386(true));
- return g_abi_mac_sp;
- }
- else
- {
- if (!g_abi_other_sp)
- g_abi_other_sp.reset (new ABIMacOSX_i386(false));
- return g_abi_other_sp;
- }
+ static ABISP g_abi_sp;
+ if (arch.GetTriple().getArch() == llvm::Triple::x86)
+ {
+ if (!g_abi_sp)
+ g_abi_sp.reset (new ABIMacOSX_i386);
+ return g_abi_sp;
}
return ABISP();
}
Modified: lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h?rev=201637&r1=201636&r2=201637&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h (original)
+++ lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h Tue Feb 18 21:42:19 2014
@@ -71,24 +71,25 @@ public:
return true;
}
+ // The Darwin i386 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
+ // before the handler is invoked. This means that lldb will stop the unwind
+ // early -- before the function which caused the trap.
+ //
+ // To work around this, we relax that alignment to be just word-size (4-bytes).
+ // Whitelisting the trap handlers for user space would be easy (_sigtramp) but
+ // in other environments there can be a large number of different functions
+ // involved in async traps.
+ //
+ // If we were to enforce 16-byte alignment, we also need to relax to 4-byte
+ // alignment for non-darwin i386 targets.
virtual bool
CallFrameAddressIsValid (lldb::addr_t cfa)
{
- // Darwin call frame addresses must be 16-byte aligned, but other OS's
- // only need 4-byte alignment. Otherwise the ABI matches, so we have
- // this one minor override here.
- if (target_is_darwin)
- {
- // Make sure the stack call frame addresses are are 16 byte aligned
- if (cfa & (16ull - 1ull))
- return false; // Not 16 byte aligned
- }
- else
- {
- // Make sure the stack call frame addresses are are 4 byte aligned
- if (cfa & (4ull - 1ull))
- return false; // Not 4 byte aligned
- }
+ // Make sure the stack call frame addresses are are 4 byte aligned
+ if (cfa & (4ull - 1ull))
+ return false; // Not 4 byte aligned
if (cfa == 0)
return false; // Zero is not a valid stack address
return true;
@@ -139,11 +140,7 @@ protected:
RegisterIsCalleeSaved (const lldb_private::RegisterInfo *reg_info);
private:
- ABIMacOSX_i386(bool is_darwin) : lldb_private::ABI(),
- target_is_darwin(is_darwin)
- { } // Call CreateInstance instead.
-
- bool target_is_darwin;
+ ABIMacOSX_i386() : lldb_private::ABI() { } // Call CreateInstance instead.
};
Modified: lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h?rev=201637&r1=201636&r2=201637&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h (original)
+++ lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h Tue Feb 18 21:42:19 2014
@@ -68,12 +68,22 @@ public:
return true;
}
+ // The SysV x86_64 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
+ // before the handler is invoked. This means that lldb will stop the unwind
+ // early -- before the function which caused the trap.
+ //
+ // To work around this, we relax that alignment to be just word-size (8-bytes).
+ // Whitelisting the trap handlers for user space would be easy (_sigtramp) but
+ // in other environments there can be a large number of different functions
+ // involved in async traps.
virtual bool
CallFrameAddressIsValid (lldb::addr_t cfa)
{
- // Make sure the stack call frame addresses are 16 byte aligned
- if (cfa & (16ull - 1ull))
- return false; // Not 16 byte aligned
+ // Make sure the stack call frame addresses are 8 byte aligned
+ if (cfa & (8ull - 1ull))
+ return false; // Not 8 byte aligned
if (cfa == 0)
return false; // Zero is not a valid stack address
return true;
More information about the lldb-commits
mailing list