101 lines · c
1//===------------------- ABISysV_i386.h -------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_ABI_X86_ABISYSV_I386_H10#define LLDB_SOURCE_PLUGINS_ABI_X86_ABISYSV_I386_H11 12#include "Plugins/ABI/X86/ABIX86_i386.h"13#include "lldb/lldb-private.h"14 15class ABISysV_i386 : public ABIX86_i386 {16public:17 ~ABISysV_i386() override = default;18 19 size_t GetRedZoneSize() const override {20 return 0; // There is no red zone for i386 Architecture21 }22 23 bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp,24 lldb::addr_t functionAddress,25 lldb::addr_t returnAddress,26 llvm::ArrayRef<lldb::addr_t> args) const override;27 28 bool GetArgumentValues(lldb_private::Thread &thread,29 lldb_private::ValueList &values) const override;30 31 lldb_private::Status32 SetReturnValueObject(lldb::StackFrameSP &frame_sp,33 lldb::ValueObjectSP &new_value) override;34 35 lldb::ValueObjectSP36 GetReturnValueObjectImpl(lldb_private::Thread &thread,37 lldb_private::CompilerType &type) const override;38 39 lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override;40 41 lldb::UnwindPlanSP CreateDefaultUnwindPlan() override;42 43 bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override {44 return !RegisterIsCalleeSaved(reg_info);45 }46 47 // The SysV i386 ABI requires that stack frames be 16 byte aligned.48 // When there is a trap handler on the stack, e.g. _sigtramp in userland49 // code, we've seen that the stack pointer is often not aligned properly50 // before the handler is invoked. This means that lldb will stop the unwind51 // early -- before the function which caused the trap.52 //53 // To work around this, we relax that alignment to be just word-size54 // (4-bytes).55 // Allowing the trap handlers for user space would be easy (_sigtramp) but56 // in other environments there can be a large number of different functions57 // involved in async traps.58 59 // ToDo: When __m256 arguments are passed then stack frames should be60 // 32 byte aligned. Decide what to do for 32 byte alignment checking61 bool CallFrameAddressIsValid(lldb::addr_t cfa) override {62 // Make sure the stack call frame addresses are 4 byte aligned63 if (cfa & (4ull - 1ull))64 return false; // Not 4 byte aligned65 if (cfa == 0)66 return false; // Zero is not a valid stack address67 return true;68 }69 70 bool CodeAddressIsValid(lldb::addr_t pc) override {71 // Check whether the address is a valid 32 bit address72 return (pc <= UINT32_MAX);73 }74 75 // Static Functions76 77 static void Initialize();78 79 static void Terminate();80 81 static lldb::ABISP CreateInstance(lldb::ProcessSP process_sp, const lldb_private::ArchSpec &arch);82 83 // PluginInterface protocol84 85 static llvm::StringRef GetPluginNameStatic() { return "sysv-i386"; }86 87 llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }88 89protected:90 lldb::ValueObjectSP91 GetReturnValueObjectSimple(lldb_private::Thread &thread,92 lldb_private::CompilerType &ast_type) const;93 94 bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);95 96private:97 using ABIX86_i386::ABIX86_i386; // Call CreateInstance instead.98};99 100#endif // LLDB_SOURCE_PLUGINS_ABI_X86_ABISYSV_I386_H101