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