brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · b602729 Raw
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