124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ABISysV_x86_64.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_ABISysV_x86_64_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ABISysV_x86_64_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
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ABISysV_x86_64 :
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public lldb_private::ABI
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
2537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    ~ABISysV_x86_64()
2675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    {
2775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    }
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetRedZoneSize () const;
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
3375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    PrepareTrivialCall (lldb_private::Thread &thread,
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        lldb::addr_t sp,
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        lldb::addr_t functionAddress,
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        lldb::addr_t returnAddress,
37989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg1_ptr = NULL,
38989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg2_ptr = NULL,
39989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg3_ptr = NULL,
40989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg4_ptr = NULL,
41989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg5_ptr = NULL,
42989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                        lldb::addr_t *arg6_ptr = NULL) const;
4375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
4475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    virtual bool
4575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    GetArgumentValues (lldb_private::Thread &thread,
4675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                       lldb_private::ValueList &values) const;
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    virtual lldb_private::Error
49a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value);
50a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
51016ef8886cd429f8a53bff967e601f831e409eaaJim Inghamprotected:
52016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    lldb::ValueObjectSP
53016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    GetReturnValueObjectSimple (lldb_private::Thread &thread,
54f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                lldb_private::ClangASTType &ast_type) const;
55466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
56016ef8886cd429f8a53bff967e601f831e409eaaJim Inghampublic:
57016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    virtual lldb::ValueObjectSP
58016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    GetReturnValueObjectImpl (lldb_private::Thread &thread,
59016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                          lldb_private::ClangASTType &type) const;
60016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
6275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    CreateFunctionEntryUnwindPlan (lldb_private::UnwindPlan &unwind_plan);
6375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
6475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    virtual bool
6575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    CreateDefaultUnwindPlan (lldb_private::UnwindPlan &unwind_plan);
6675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
6775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    virtual bool
6875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    RegisterIsVolatile (const lldb_private::RegisterInfo *reg_info);
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7054b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    virtual bool
7154b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    StackUsesFrames ()
7254b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    {
7354b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        return true;
7454b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    }
7554b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton
7654b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    virtual bool
7754b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    CallFrameAddressIsValid (lldb::addr_t cfa)
7854b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    {
7954b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        // Make sure the stack call frame addresses are are 8 byte aligned
8054b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        if (cfa & (8ull - 1ull))
8154b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton            return false;   // Not 8 byte aligned
8254b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        if (cfa == 0)
8354b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton            return false;   // Zero is not a valid stack address
8454b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        return true;
8554b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    }
8654b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton
8754b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    virtual bool
8854b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    CodeAddressIsValid (lldb::addr_t pc)
8954b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    {
9054b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        // We have a 64 bit address space, so anything is valid as opcodes
9154b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        // aren't fixed width...
9254b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton        return true;
9354b38413f62af3bcaeb8802a978cc621c8e88eb1Greg Clayton    }
945d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda
955d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda    virtual bool
965d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda    FunctionCallsChangeCFA ()
975d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda    {
985d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda        return true;
995d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda    }
1005d30ea748f55faa7542c1b3ba31fe36f402beee2Jason Molenda
10137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    virtual const lldb_private::RegisterInfo *
10237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    GetRegisterInfoArray (uint32_t &count);
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Static Functions
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Initialize();
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Terminate();
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    static lldb::ABISP
11375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    CreateInstance (const lldb_private::ArchSpec &arch);
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1150e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    static lldb_private::ConstString
1160e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    GetPluginNameStatic();
1170e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // PluginInterface protocol
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
1210e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    virtual lldb_private::ConstString
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginName();
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginVersion();
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
12837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    void
12937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    CreateRegisterMapIfNeeded ();
13037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
13175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    bool
13275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    RegisterIsCalleeSaved (const lldb_private::RegisterInfo *reg_info);
13375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ABISysV_x86_64() : lldb_private::ABI() { } // Call CreateInstance instead.
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ABI_h_
139