Path: blob/main/contrib/llvm-project/lldb/source/Plugins/ABI/X86/ABISysV_i386.h
39654 views
//===------------------- ABISysV_i386.h -------------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLDB_SOURCE_PLUGINS_ABI_X86_ABISYSV_I386_H9#define LLDB_SOURCE_PLUGINS_ABI_X86_ABISYSV_I386_H1011#include "Plugins/ABI/X86/ABIX86_i386.h"12#include "lldb/lldb-private.h"1314class ABISysV_i386 : public ABIX86_i386 {15public:16~ABISysV_i386() override = default;1718size_t GetRedZoneSize() const override {19return 0; // There is no red zone for i386 Architecture20}2122bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp,23lldb::addr_t functionAddress,24lldb::addr_t returnAddress,25llvm::ArrayRef<lldb::addr_t> args) const override;2627bool GetArgumentValues(lldb_private::Thread &thread,28lldb_private::ValueList &values) const override;2930lldb_private::Status31SetReturnValueObject(lldb::StackFrameSP &frame_sp,32lldb::ValueObjectSP &new_value) override;3334lldb::ValueObjectSP35GetReturnValueObjectImpl(lldb_private::Thread &thread,36lldb_private::CompilerType &type) const override;3738bool39CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;4041bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;4243bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override {44return !RegisterIsCalleeSaved(reg_info);45}4647// 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.5859// ToDo: When __m256 arguments are passed then stack frames should be60// 32 byte aligned. Decide what to do for 32 byte alignment checking61bool CallFrameAddressIsValid(lldb::addr_t cfa) override {62// Make sure the stack call frame addresses are 4 byte aligned63if (cfa & (4ull - 1ull))64return false; // Not 4 byte aligned65if (cfa == 0)66return false; // Zero is not a valid stack address67return true;68}6970bool CodeAddressIsValid(lldb::addr_t pc) override {71// Check whether the address is a valid 32 bit address72return (pc <= UINT32_MAX);73}7475// Static Functions7677static void Initialize();7879static void Terminate();8081static lldb::ABISP CreateInstance(lldb::ProcessSP process_sp, const lldb_private::ArchSpec &arch);8283// PluginInterface protocol8485static llvm::StringRef GetPluginNameStatic() { return "sysv-i386"; }8687llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }8889protected:90lldb::ValueObjectSP91GetReturnValueObjectSimple(lldb_private::Thread &thread,92lldb_private::CompilerType &ast_type) const;9394bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);9596private:97using ABIX86_i386::ABIX86_i386; // Call CreateInstance instead.98};99100#endif // LLDB_SOURCE_PLUGINS_ABI_X86_ABISYSV_I386_H101102103