File indexing completed on 2026-05-10 08:42:53
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLDB_TARGET_ABI_H
0010 #define LLDB_TARGET_ABI_H
0011
0012 #include "lldb/Core/PluginInterface.h"
0013 #include "lldb/Symbol/UnwindPlan.h"
0014 #include "lldb/Target/DynamicRegisterInfo.h"
0015 #include "lldb/Utility/Status.h"
0016 #include "lldb/lldb-private.h"
0017
0018 #include "llvm/ADT/ArrayRef.h"
0019 #include "llvm/MC/MCRegisterInfo.h"
0020
0021 namespace llvm {
0022 class Type;
0023 }
0024
0025 namespace lldb_private {
0026
0027 class ABI : public PluginInterface {
0028 public:
0029 struct CallArgument {
0030 enum eType {
0031 HostPointer = 0,
0032 TargetValue,
0033 };
0034 eType type;
0035 size_t size;
0036
0037 lldb::addr_t value;
0038 std::unique_ptr<uint8_t[]> data_up;
0039 };
0040
0041 ~ABI() override;
0042
0043 virtual size_t GetRedZoneSize() const = 0;
0044
0045 virtual bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp,
0046 lldb::addr_t functionAddress,
0047 lldb::addr_t returnAddress,
0048 llvm::ArrayRef<lldb::addr_t> args) const = 0;
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 virtual bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp,
0061 lldb::addr_t functionAddress,
0062 lldb::addr_t returnAddress,
0063 llvm::Type &prototype,
0064 llvm::ArrayRef<CallArgument> args) const;
0065
0066 virtual bool GetArgumentValues(Thread &thread, ValueList &values) const = 0;
0067
0068 lldb::ValueObjectSP GetReturnValueObject(Thread &thread, CompilerType &type,
0069 bool persistent = true) const;
0070
0071
0072 lldb::ValueObjectSP GetReturnValueObject(Thread &thread, llvm::Type &type,
0073 bool persistent = true) const;
0074
0075
0076 virtual Status SetReturnValueObject(lldb::StackFrameSP &frame_sp,
0077 lldb::ValueObjectSP &new_value) = 0;
0078
0079 protected:
0080
0081
0082
0083 virtual lldb::ValueObjectSP
0084 GetReturnValueObjectImpl(Thread &thread, CompilerType &ast_type) const = 0;
0085
0086
0087 virtual lldb::ValueObjectSP
0088 GetReturnValueObjectImpl(Thread &thread, llvm::Type &ir_type) const;
0089
0090
0091
0092
0093
0094
0095
0096 lldb::ProcessSP GetProcessSP() const { return m_process_wp.lock(); }
0097
0098 public:
0099 virtual bool CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) = 0;
0100
0101 virtual bool CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) = 0;
0102
0103 virtual bool RegisterIsVolatile(const RegisterInfo *reg_info) = 0;
0104
0105 virtual bool GetFallbackRegisterLocation(
0106 const RegisterInfo *reg_info,
0107 UnwindPlan::Row::AbstractRegisterLocation &unwind_regloc);
0108
0109
0110
0111
0112
0113
0114
0115 virtual bool CallFrameAddressIsValid(lldb::addr_t cfa) = 0;
0116
0117
0118
0119 virtual bool CodeAddressIsValid(lldb::addr_t pc) = 0;
0120
0121
0122
0123
0124
0125 virtual lldb::addr_t FixCodeAddress(lldb::addr_t pc);
0126 virtual lldb::addr_t FixDataAddress(lldb::addr_t pc);
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 virtual lldb::addr_t FixAnyAddress(lldb::addr_t pc) {
0137
0138
0139
0140 return FixDataAddress(pc);
0141 }
0142
0143 llvm::MCRegisterInfo &GetMCRegisterInfo() { return *m_mc_register_info_up; }
0144
0145 virtual void
0146 AugmentRegisterInfo(std::vector<DynamicRegisterInfo::Register> ®s) = 0;
0147
0148 virtual bool GetPointerReturnRegister(const char *&name) { return false; }
0149
0150 virtual uint64_t GetStackFrameSize() { return 512 * 1024; }
0151
0152 static lldb::ABISP FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch);
0153
0154 protected:
0155 ABI(lldb::ProcessSP process_sp, std::unique_ptr<llvm::MCRegisterInfo> info_up)
0156 : m_process_wp(process_sp), m_mc_register_info_up(std::move(info_up)) {
0157 assert(m_mc_register_info_up && "ABI must have MCRegisterInfo");
0158 }
0159
0160
0161
0162
0163 static std::unique_ptr<llvm::MCRegisterInfo>
0164 MakeMCRegisterInfo(const ArchSpec &arch);
0165
0166 lldb::ProcessWP m_process_wp;
0167 std::unique_ptr<llvm::MCRegisterInfo> m_mc_register_info_up;
0168
0169 private:
0170 ABI(const ABI &) = delete;
0171 const ABI &operator=(const ABI &) = delete;
0172 };
0173
0174 class RegInfoBasedABI : public ABI {
0175 public:
0176 void AugmentRegisterInfo(
0177 std::vector<DynamicRegisterInfo::Register> ®s) override;
0178
0179 protected:
0180 using ABI::ABI;
0181
0182 bool GetRegisterInfoByName(llvm::StringRef name, RegisterInfo &info);
0183
0184 virtual const RegisterInfo *GetRegisterInfoArray(uint32_t &count) = 0;
0185 };
0186
0187 class MCBasedABI : public ABI {
0188 public:
0189 void AugmentRegisterInfo(
0190 std::vector<DynamicRegisterInfo::Register> ®s) override;
0191
0192
0193
0194 static void MapRegisterName(std::string ®, llvm::StringRef from_prefix,
0195 llvm::StringRef to_prefix);
0196
0197 protected:
0198 using ABI::ABI;
0199
0200
0201 virtual std::pair<uint32_t, uint32_t> GetEHAndDWARFNums(llvm::StringRef reg);
0202
0203
0204 virtual uint32_t GetGenericNum(llvm::StringRef reg) = 0;
0205
0206
0207
0208 virtual std::string GetMCName(std::string reg) { return reg; }
0209 };
0210
0211 }
0212
0213 #endif