xref: /NextBSD/contrib/llvm/tools/lldb/source/Plugins/ABI/SysV-arm/ABISysV_arm.h (revision 84d351007654069f9643c8e4b4802a7f5f08ee42)
1 //===-- ABISysV_arm.h ----------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef liblldb_ABISysV_arm_h_
11 #define liblldb_ABISysV_arm_h_
12 
13 // C Includes
14 // C++ Includes
15 // Other libraries and framework includes
16 // Project includes
17 #include "lldb/lldb-private.h"
18 #include "lldb/Target/ABI.h"
19 
20 class ABISysV_arm : public lldb_private::ABI
21 {
22 public:
~ABISysV_arm()23     ~ABISysV_arm() { }
24 
25     size_t
26     GetRedZoneSize () const override;
27 
28     bool
29     PrepareTrivialCall (lldb_private::Thread &thread,
30                         lldb::addr_t sp,
31                         lldb::addr_t func_addr,
32                         lldb::addr_t returnAddress,
33                         llvm::ArrayRef<lldb::addr_t> args) const override;
34 
35     bool
36     GetArgumentValues (lldb_private::Thread &thread,
37                        lldb_private::ValueList &values) const override;
38 
39     lldb_private::Error
40     SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value) override;
41 
42 protected:
43     lldb::ValueObjectSP
44     GetReturnValueObjectImpl (lldb_private::Thread &thread,
45                     lldb_private::ClangASTType &ast_type) const override;
46 
47 public:
48     bool
49     CreateFunctionEntryUnwindPlan (lldb_private::UnwindPlan &unwind_plan) override;
50 
51     bool
52     CreateDefaultUnwindPlan (lldb_private::UnwindPlan &unwind_plan) override;
53 
54     bool
55     RegisterIsVolatile (const lldb_private::RegisterInfo *reg_info) override;
56 
57     bool
CallFrameAddressIsValid(lldb::addr_t cfa)58     CallFrameAddressIsValid (lldb::addr_t cfa) override
59     {
60         // Make sure the stack call frame addresses are are 4 byte aligned
61         if (cfa & (4ull - 1ull))
62             return false;   // Not 4 byte aligned
63         if (cfa == 0)
64             return false;   // Zero is not a valid stack address
65         return true;
66     }
67 
68     bool
CodeAddressIsValid(lldb::addr_t pc)69     CodeAddressIsValid (lldb::addr_t pc) override
70     {
71         // Just make sure the address is a valid 32 bit address. Bit zero
72         // might be set due to Thumb function calls, so don't enforce 2 byte
73         // alignment
74         return pc <= UINT32_MAX;
75     }
76 
77     lldb::addr_t
FixCodeAddress(lldb::addr_t pc)78     FixCodeAddress (lldb::addr_t pc) override
79     {
80         // ARM uses bit zero to signify a code address is thumb, so we must
81         // strip bit zero in any code addresses.
82         return pc & ~(lldb::addr_t)1;
83     }
84 
85     const lldb_private::RegisterInfo *
86     GetRegisterInfoArray (uint32_t &count) override;
87 
88     //------------------------------------------------------------------
89     // Static Functions
90     //------------------------------------------------------------------
91     static void
92     Initialize();
93 
94     static void
95     Terminate();
96 
97     static lldb::ABISP
98     CreateInstance (const lldb_private::ArchSpec &arch);
99 
100     static lldb_private::ConstString
101     GetPluginNameStatic();
102 
103     //------------------------------------------------------------------
104     // PluginInterface protocol
105     //------------------------------------------------------------------
106     lldb_private::ConstString
107     GetPluginName() override;
108 
109     uint32_t
110     GetPluginVersion() override;
111 
112 protected:
113 private:
ABISysV_arm()114     ABISysV_arm() :
115         lldb_private::ABI()
116     {
117          // Call CreateInstance instead.
118     }
119 };
120 
121 #endif  // liblldb_ABISysV_arm_h_
122