aboutsummaryrefslogtreecommitdiff
path: root/source/Plugins/ABI/SysV-i386/ABISysV_i386.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/Plugins/ABI/SysV-i386/ABISysV_i386.h')
-rw-r--r--source/Plugins/ABI/SysV-i386/ABISysV_i386.h204
1 files changed, 90 insertions, 114 deletions
diff --git a/source/Plugins/ABI/SysV-i386/ABISysV_i386.h b/source/Plugins/ABI/SysV-i386/ABISysV_i386.h
index 2d0f097c328e..8d1d76b5dfd9 100644
--- a/source/Plugins/ABI/SysV-i386/ABISysV_i386.h
+++ b/source/Plugins/ABI/SysV-i386/ABISysV_i386.h
@@ -14,128 +14,104 @@
// C++ Includes
// Other libraries and framework includes
// Project includes
-#include "lldb/lldb-private.h"
#include "lldb/Target/ABI.h"
+#include "lldb/lldb-private.h"
-class ABISysV_i386 :
- public lldb_private::ABI
-{
+class ABISysV_i386 : public lldb_private::ABI {
public:
- ~ABISysV_i386() override = default;
-
- size_t
- GetRedZoneSize () const override
- {
- return 0; // There is no red zone for i386 Architecture
- }
-
- bool
- PrepareTrivialCall (lldb_private::Thread &thread,
- lldb::addr_t sp,
- lldb::addr_t functionAddress,
- lldb::addr_t returnAddress,
- llvm::ArrayRef<lldb::addr_t> args) const override;
-
- bool
- GetArgumentValues (lldb_private::Thread &thread,
- lldb_private::ValueList &values) const override;
-
- lldb_private::Error
- SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value) override;
-
- lldb::ValueObjectSP
- GetReturnValueObjectImpl (lldb_private::Thread &thread,
- lldb_private::CompilerType &type) const override;
-
- bool
- CreateFunctionEntryUnwindPlan (lldb_private::UnwindPlan &unwind_plan) override;
-
- bool
- CreateDefaultUnwindPlan (lldb_private::UnwindPlan &unwind_plan) override;
-
- bool
- RegisterIsVolatile (const lldb_private::RegisterInfo *reg_info) override
- {
- return !RegisterIsCalleeSaved (reg_info);
- }
-
- // The SysV 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.
-
- // ToDo: When __m256 arguments are passed then stack frames should be
- // 32 byte aligned. Decide what to do for 32 byte alignment checking
- bool
- CallFrameAddressIsValid (lldb::addr_t cfa) override
- {
- // Make sure the stack call frame addresses 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;
- }
-
- bool
- CodeAddressIsValid (lldb::addr_t pc) override
- {
- // Check whether the address is a valid 32 bit address
- return (pc <= UINT32_MAX);
- }
-
- const lldb_private::RegisterInfo *
- GetRegisterInfoArray (uint32_t &count) override;
-
- //------------------------------------------------------------------
- // Static Functions
- //------------------------------------------------------------------
-
- static void
- Initialize();
-
- static void
- Terminate();
-
- static lldb::ABISP
- CreateInstance (const lldb_private::ArchSpec &arch);
-
- //------------------------------------------------------------------
- // PluginInterface protocol
- //------------------------------------------------------------------
-
- static lldb_private::ConstString
- GetPluginNameStatic();
-
- lldb_private::ConstString
- GetPluginName() override;
-
- uint32_t
- GetPluginVersion() override
- {
- return 1;
- }
+ ~ABISysV_i386() override = default;
+
+ size_t GetRedZoneSize() const override {
+ return 0; // There is no red zone for i386 Architecture
+ }
+
+ bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp,
+ lldb::addr_t functionAddress,
+ lldb::addr_t returnAddress,
+ llvm::ArrayRef<lldb::addr_t> args) const override;
+
+ bool GetArgumentValues(lldb_private::Thread &thread,
+ lldb_private::ValueList &values) const override;
+
+ lldb_private::Error
+ SetReturnValueObject(lldb::StackFrameSP &frame_sp,
+ lldb::ValueObjectSP &new_value) override;
+
+ lldb::ValueObjectSP
+ GetReturnValueObjectImpl(lldb_private::Thread &thread,
+ lldb_private::CompilerType &type) const override;
+
+ bool
+ CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
+
+ bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
+
+ bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override {
+ return !RegisterIsCalleeSaved(reg_info);
+ }
+
+ // The SysV 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.
+
+ // ToDo: When __m256 arguments are passed then stack frames should be
+ // 32 byte aligned. Decide what to do for 32 byte alignment checking
+ bool CallFrameAddressIsValid(lldb::addr_t cfa) override {
+ // Make sure the stack call frame addresses 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;
+ }
+
+ bool CodeAddressIsValid(lldb::addr_t pc) override {
+ // Check whether the address is a valid 32 bit address
+ return (pc <= UINT32_MAX);
+ }
+
+ const lldb_private::RegisterInfo *
+ GetRegisterInfoArray(uint32_t &count) override;
+
+ //------------------------------------------------------------------
+ // Static Functions
+ //------------------------------------------------------------------
+
+ static void Initialize();
+
+ static void Terminate();
+
+ static lldb::ABISP CreateInstance(const lldb_private::ArchSpec &arch);
+
+ //------------------------------------------------------------------
+ // PluginInterface protocol
+ //------------------------------------------------------------------
+
+ static lldb_private::ConstString GetPluginNameStatic();
+
+ lldb_private::ConstString GetPluginName() override;
+
+ uint32_t GetPluginVersion() override { return 1; }
protected:
- lldb::ValueObjectSP
- GetReturnValueObjectSimple(lldb_private::Thread &thread,
- lldb_private::CompilerType &ast_type) const;
+ lldb::ValueObjectSP
+ GetReturnValueObjectSimple(lldb_private::Thread &thread,
+ lldb_private::CompilerType &ast_type) const;
- bool
- RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
+ bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
private:
- ABISysV_i386() :
- lldb_private::ABI()
- {
- // Call CreateInstance instead.
- }
+ ABISysV_i386() : lldb_private::ABI() {
+ // Call CreateInstance instead.
+ }
};
#endif // liblldb_ABISysV_i386_h_