ABIMacOSX_arm.h revision 263367
1//===-- ABIMacOSX_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_ABIMacOSX_arm_h_
11#define liblldb_ABIMacOSX_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
20class ABIMacOSX_arm : public lldb_private::ABI
21{
22public:
23    ~ABIMacOSX_arm() { }
24
25    virtual size_t
26    GetRedZoneSize () const;
27
28    virtual 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;
34
35    virtual bool
36    GetArgumentValues (lldb_private::Thread &thread,
37                       lldb_private::ValueList &values) const;
38
39    virtual lldb_private::Error
40    SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value);
41
42protected:
43    virtual lldb::ValueObjectSP
44    GetReturnValueObjectImpl (lldb_private::Thread &thread,
45                    lldb_private::ClangASTType &ast_type) const;
46
47public:
48    virtual bool
49    CreateFunctionEntryUnwindPlan (lldb_private::UnwindPlan &unwind_plan);
50
51    virtual bool
52    CreateDefaultUnwindPlan (lldb_private::UnwindPlan &unwind_plan);
53
54    virtual bool
55    RegisterIsVolatile (const lldb_private::RegisterInfo *reg_info);
56
57    virtual bool
58    StackUsesFrames ()
59    {
60        return true;
61    }
62
63    virtual bool
64    CallFrameAddressIsValid (lldb::addr_t cfa)
65    {
66        // Make sure the stack call frame addresses are are 4 byte aligned
67        if (cfa & (4ull - 1ull))
68            return false;   // Not 4 byte aligned
69        if (cfa == 0)
70            return false;   // Zero is not a valid stack address
71        return true;
72    }
73
74    virtual bool
75    CodeAddressIsValid (lldb::addr_t pc)
76    {
77        // Just make sure the address is a valid 32 bit address. Bit zero
78        // might be set due to Thumb function calls, so don't enforce 2 byte
79        // alignment
80        return pc <= UINT32_MAX;
81    }
82
83    virtual lldb::addr_t
84    FixCodeAddress (lldb::addr_t pc)
85    {
86        // ARM uses bit zero to signify a code address is thumb, so we must
87        // strip bit zero in any code addresses.
88        return pc & ~(lldb::addr_t)1;
89    }
90
91    virtual bool
92    FunctionCallsChangeCFA ()
93    {
94        return false;
95    }
96
97    virtual const lldb_private::RegisterInfo *
98    GetRegisterInfoArray (uint32_t &count);
99
100    //------------------------------------------------------------------
101    // Static Functions
102    //------------------------------------------------------------------
103    static void
104    Initialize();
105
106    static void
107    Terminate();
108
109    static lldb::ABISP
110    CreateInstance (const lldb_private::ArchSpec &arch);
111
112    static lldb_private::ConstString
113    GetPluginNameStatic();
114
115    //------------------------------------------------------------------
116    // PluginInterface protocol
117    //------------------------------------------------------------------
118    virtual lldb_private::ConstString
119    GetPluginName();
120
121    virtual uint32_t
122    GetPluginVersion();
123
124protected:
125private:
126    ABIMacOSX_arm() :
127        lldb_private::ABI()
128    {
129         // Call CreateInstance instead.
130    }
131};
132
133#endif  // liblldb_ABIMacOSX_arm_h_
134