124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ABIMacOSX_i386.h ----------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_ABIMacOSX_i386_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ABIMacOSX_i386_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ABI.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Value.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2175906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonclass ABIMacOSX_i386 :
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public lldb_private::ABI
2375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{
2475906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonpublic:
2575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
2675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    ~ABIMacOSX_i386() { }
2775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
2875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    virtual size_t
2975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    GetRedZoneSize () const;
3075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
3175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    virtual bool
3275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    PrepareTrivialCall (lldb_private::Thread &thread,
3375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                        lldb::addr_t sp,
3461d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton                        lldb::addr_t func_addr,
3561d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton                        lldb::addr_t return_addr,
36989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg1_ptr = NULL,
37989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg2_ptr = NULL,
38989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg3_ptr = NULL,
39989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg4_ptr = NULL,
40989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg5_ptr = NULL,
41989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg6_ptr = NULL) const;
4275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
4375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    virtual bool
4475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    PrepareNormalCall (lldb_private::Thread &thread,
4575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                       lldb::addr_t sp,
4661d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton                       lldb::addr_t func_addr,
4761d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton                       lldb::addr_t return_addr,
4875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                       lldb_private::ValueList &args) const;
4975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
5075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    virtual bool
5175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    GetArgumentValues (lldb_private::Thread &thread,
5275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                       lldb_private::ValueList &values) const;
5375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
54a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    virtual lldb_private::Error
55a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value);
56a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
57016ef8886cd429f8a53bff967e601f831e409eaaJim Inghamprotected:
58016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    virtual lldb::ValueObjectSP
59016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    GetReturnValueObjectImpl (lldb_private::Thread &thread,
60016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    lldb_private::ClangASTType &ast_type) const;
61016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
62016ef8886cd429f8a53bff967e601f831e409eaaJim Inghampublic:
6375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
6475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    virtual bool
6575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    CreateFunctionEntryUnwindPlan (lldb_private::UnwindPlan &unwind_plan);
6675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
6775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    virtual bool
6875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    CreateDefaultUnwindPlan (lldb_private::UnwindPlan &unwind_plan);
6975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
7075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    virtual bool
7175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    RegisterIsVolatile (const lldb_private::RegisterInfo *reg_info);
7275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
7354b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    virtual bool
7454b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    StackUsesFrames ()
7554b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    {
7654b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        return true;
7754b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    }
7854b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton
7954b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    virtual bool
8054b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    CallFrameAddressIsValid (lldb::addr_t cfa)
8154b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    {
8254b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        // Make sure the stack call frame addresses are are 8 byte aligned
8354b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        if (cfa & (8ull - 1ull))
8454b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton            return false;   // Not 8 byte aligned
8554b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        if (cfa == 0)
8654b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton            return false;   // Zero is not a valid stack address
8754b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        return true;
8854b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    }
8954b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton
9054b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    virtual bool
9154b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    CodeAddressIsValid (lldb::addr_t pc)
9254b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    {
9354b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        // Just make sure the address is a valid 32 bit address.
9454b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        return pc <= UINT32_MAX;
9554b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    }
965d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda
975d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda    virtual bool
985d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda    FunctionCallsChangeCFA ()
995d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda    {
1005d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda        return true;
1015d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda    }
1025d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda
10337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    virtual const lldb_private::RegisterInfo *
10437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    GetRegisterInfoArray (uint32_t &count);
10575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
10675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    //------------------------------------------------------------------
10775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    // Static Functions
10875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    //------------------------------------------------------------------
10975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    static void
11075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    Initialize();
11175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
11275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    static void
11375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    Terminate();
11475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
11575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    static lldb::ABISP
11675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    CreateInstance (const lldb_private::ArchSpec &arch);
11775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
11875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    //------------------------------------------------------------------
11975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    // PluginInterface protocol
12075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    //------------------------------------------------------------------
1210e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    static lldb_private::ConstString
1220e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    GetPluginNameStatic ();
1230e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
1240e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    virtual lldb_private::ConstString
12575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    GetPluginName();
12675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
12775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    virtual uint32_t
12875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    GetPluginVersion();
12975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
13075906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonprotected:
13175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    bool
13275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    RegisterIsCalleeSaved (const lldb_private::RegisterInfo *reg_info);
13375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
13475906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonprivate:
13575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    ABIMacOSX_i386() : lldb_private::ABI() { } // Call CreateInstance instead.
13675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton};
13775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ABI_h_
140