]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - source/Plugins/ABI/SysV-hexagon/ABISysV_hexagon.h
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / source / Plugins / ABI / SysV-hexagon / ABISysV_hexagon.h
1 //===-- ABISysV_hexagon.h ----------------------------------------*- C++
2 //-*-===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #ifndef liblldb_ABISysV_hexagon_h_
12 #define liblldb_ABISysV_hexagon_h_
13
14 // C Includes
15 // C++ Includes
16 // Other libraries and framework includes
17 // Project includes
18 #include "lldb/Target/ABI.h"
19 #include "lldb/lldb-private.h"
20
21 class ABISysV_hexagon : public lldb_private::ABI {
22 public:
23   ~ABISysV_hexagon() override = default;
24
25   size_t GetRedZoneSize() const override;
26
27   bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp,
28                           lldb::addr_t functionAddress,
29                           lldb::addr_t returnAddress,
30                           llvm::ArrayRef<lldb::addr_t> args) const override;
31
32   // special thread plan for GDB style non-jit function calls
33   bool
34   PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp,
35                      lldb::addr_t functionAddress, lldb::addr_t returnAddress,
36                      llvm::Type &prototype,
37                      llvm::ArrayRef<ABI::CallArgument> args) const override;
38
39   bool GetArgumentValues(lldb_private::Thread &thread,
40                          lldb_private::ValueList &values) const override;
41
42   lldb_private::Error
43   SetReturnValueObject(lldb::StackFrameSP &frame_sp,
44                        lldb::ValueObjectSP &new_value) override;
45
46   lldb::ValueObjectSP
47   GetReturnValueObjectImpl(lldb_private::Thread &thread,
48                            lldb_private::CompilerType &type) const override;
49
50   // specialized to work with llvm IR types
51   lldb::ValueObjectSP GetReturnValueObjectImpl(lldb_private::Thread &thread,
52                                                llvm::Type &type) const override;
53
54   bool
55   CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
56
57   bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
58
59   bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override;
60
61   bool CallFrameAddressIsValid(lldb::addr_t cfa) override {
62     // Make sure the stack call frame addresses are 8 byte aligned
63     if (cfa & 0x07)
64       return false; // Not 8 byte aligned
65     if (cfa == 0)
66       return false; // Zero is not a valid stack address
67     return true;
68   }
69
70   bool CodeAddressIsValid(lldb::addr_t pc) override {
71     // We have a 64 bit address space, so anything is valid as opcodes
72     // aren't fixed width...
73     return true;
74   }
75
76   const lldb_private::RegisterInfo *
77   GetRegisterInfoArray(uint32_t &count) override;
78
79   //------------------------------------------------------------------
80   // Static Functions
81   //------------------------------------------------------------------
82
83   static void Initialize();
84
85   static void Terminate();
86
87   static lldb::ABISP CreateInstance(const lldb_private::ArchSpec &arch);
88
89   static lldb_private::ConstString GetPluginNameStatic();
90
91   //------------------------------------------------------------------
92   // PluginInterface protocol
93   //------------------------------------------------------------------
94
95   lldb_private::ConstString GetPluginName() override;
96
97   uint32_t GetPluginVersion() override;
98
99 protected:
100   void CreateRegisterMapIfNeeded();
101
102   lldb::ValueObjectSP
103   GetReturnValueObjectSimple(lldb_private::Thread &thread,
104                              lldb_private::CompilerType &ast_type) const;
105
106   bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
107
108 private:
109   ABISysV_hexagon() : lldb_private::ABI() {
110     // Call CreateInstance instead.
111   }
112 };
113
114 #endif // liblldb_ABISysV_hexagon_h_