10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch//===-- ABIMacOSX_arm.h ----------------------------------------*- C++ -*-===//
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch//
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch//                     The LLVM Compiler Infrastructure
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch//
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This file is distributed under the University of Illinois Open Source
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// License. See LICENSE.TXT for details.
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch//
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch//===----------------------------------------------------------------------===//
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#ifndef liblldb_ABIMacOSX_arm_h_
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define liblldb_ABIMacOSX_arm_h_
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// C Includes
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// C++ Includes
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Other libraries and framework includes
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Project includes
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "lldb/lldb-private.h"
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "lldb/Target/ABI.h"
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass ABIMacOSX_arm : public lldb_private::ABI
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochpublic:
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ~ABIMacOSX_arm() { }
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual size_t
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    GetRedZoneSize () const;
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual bool
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrepareTrivialCall (lldb_private::Thread &thread,
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        lldb::addr_t sp,
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        lldb::addr_t func_addr,
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        lldb::addr_t returnAddress,
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        lldb::addr_t *arg1_ptr = NULL,
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        lldb::addr_t *arg2_ptr = NULL,
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        lldb::addr_t *arg3_ptr = NULL,
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        lldb::addr_t *arg4_ptr = NULL,
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        lldb::addr_t *arg5_ptr = NULL,
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                        lldb::addr_t *arg6_ptr = NULL) const;
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual bool
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    GetArgumentValues (lldb_private::Thread &thread,
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                       lldb_private::ValueList &values) const;
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    virtual lldb_private::Error
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value);
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochprotected:
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    virtual lldb::ValueObjectSP
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    GetReturnValueObjectImpl (lldb_private::Thread &thread,
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                    lldb_private::ClangASTType &ast_type) const;
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochpublic:
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual bool
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CreateFunctionEntryUnwindPlan (lldb_private::UnwindPlan &unwind_plan);
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    virtual bool
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    CreateDefaultUnwindPlan (lldb_private::UnwindPlan &unwind_plan);
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual bool
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RegisterIsVolatile (const lldb_private::RegisterInfo *reg_info);
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual bool
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    StackUsesFrames ()
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    {
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return true;
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual bool
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    CallFrameAddressIsValid (lldb::addr_t cfa)
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    {
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        // Make sure the stack call frame addresses are are 4 byte aligned
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        if (cfa & (4ull - 1ull))
730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            return false;   // Not 4 byte aligned
740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        if (cfa == 0)
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            return false;   // Zero is not a valid stack address
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        return true;
770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    virtual bool
800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    CodeAddressIsValid (lldb::addr_t pc)
810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    {
820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        // Just make sure the address is a valid 32 bit address. Bit zero
830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        // might be set due to Thumb function calls, so don't enforce 2 byte
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        // alignment
850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        return pc <= UINT32_MAX;
860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual lldb::addr_t
890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    FixCodeAddress (lldb::addr_t pc)
900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    {
910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        // ARM uses bit zero to signify a code address is thumb, so we must
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        // strip bit zero in any code addresses.
930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        return pc & ~(lldb::addr_t)1;
940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    virtual bool
970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    FunctionCallsChangeCFA ()
980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    {
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        return false;
1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual const lldb_private::RegisterInfo *
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GetRegisterInfoArray (uint32_t &count);
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    //------------------------------------------------------------------
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Static Functions
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    //------------------------------------------------------------------
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    static void
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Initialize();
1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    static void
1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    Terminate();
1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    static lldb::ABISP
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CreateInstance (const lldb_private::ArchSpec &arch);
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    static lldb_private::ConstString
1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    GetPluginNameStatic();
1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    //------------------------------------------------------------------
1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // PluginInterface protocol
1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    //------------------------------------------------------------------
1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual lldb_private::ConstString
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GetPluginName();
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    virtual uint32_t
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    GetPluginVersion();
1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)protected:
1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochprivate:
1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ABIMacOSX_arm() :
1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        lldb_private::ABI()
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    {
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         // Call CreateInstance instead.
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // liblldb_ABIMacOSX_arm_h_
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch