]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - source/Plugins/ABI/SysV-arm/ABISysV_arm.h
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / source / Plugins / ABI / SysV-arm / ABISysV_arm.h
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/Target/ABI.h"
18 #include "lldb/lldb-private.h"
19
20 class ABISysV_arm : public lldb_private::ABI {
21 public:
22   ~ABISysV_arm() override = default;
23
24   size_t GetRedZoneSize() const override;
25
26   bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp,
27                           lldb::addr_t func_addr, lldb::addr_t returnAddress,
28                           llvm::ArrayRef<lldb::addr_t> args) const override;
29
30   bool GetArgumentValues(lldb_private::Thread &thread,
31                          lldb_private::ValueList &values) const override;
32
33   lldb_private::Error
34   SetReturnValueObject(lldb::StackFrameSP &frame_sp,
35                        lldb::ValueObjectSP &new_value) override;
36
37   bool
38   CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
39
40   bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
41
42   bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override;
43
44   bool CallFrameAddressIsValid(lldb::addr_t cfa) override {
45     // Make sure the stack call frame addresses are are 4 byte aligned
46     if (cfa & (4ull - 1ull))
47       return false; // Not 4 byte aligned
48     if (cfa == 0)
49       return false; // Zero is not a valid stack address
50     return true;
51   }
52
53   bool CodeAddressIsValid(lldb::addr_t pc) override {
54     // Just make sure the address is a valid 32 bit address. Bit zero
55     // might be set due to Thumb function calls, so don't enforce 2 byte
56     // alignment
57     return pc <= UINT32_MAX;
58   }
59
60   lldb::addr_t FixCodeAddress(lldb::addr_t pc) override {
61     // ARM uses bit zero to signify a code address is thumb, so we must
62     // strip bit zero in any code addresses.
63     return pc & ~(lldb::addr_t)1;
64   }
65
66   const lldb_private::RegisterInfo *
67   GetRegisterInfoArray(uint32_t &count) override;
68
69   bool IsArmHardFloat(lldb_private::Thread &thread) const;
70
71   //------------------------------------------------------------------
72   // Static Functions
73   //------------------------------------------------------------------
74
75   static void Initialize();
76
77   static void Terminate();
78
79   static lldb::ABISP CreateInstance(const lldb_private::ArchSpec &arch);
80
81   static lldb_private::ConstString GetPluginNameStatic();
82
83   //------------------------------------------------------------------
84   // PluginInterface protocol
85   //------------------------------------------------------------------
86
87   lldb_private::ConstString GetPluginName() override;
88
89   uint32_t GetPluginVersion() override;
90
91 protected:
92   lldb::ValueObjectSP
93   GetReturnValueObjectImpl(lldb_private::Thread &thread,
94                            lldb_private::CompilerType &ast_type) const override;
95
96 private:
97   ABISysV_arm() : lldb_private::ABI() {
98     // Call CreateInstance instead.
99   }
100 };
101
102 #endif // liblldb_ABISysV_arm_h_