124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ABI.cpp -------------------------------------------------*- 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#include "lldb/Target/ABI.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
121586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham#include "lldb/Core/Value.h"
131586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham#include "lldb/Core/ValueObjectConstResult.h"
141586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham#include "lldb/Symbol/ClangASTType.h"
15016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham#include "lldb/Target/Target.h"
161586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham#include "lldb/Target/Thread.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2175906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABISP
22395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonABI::FindPlugin (const ArchSpec &arch)
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    ABISP abi_sp;
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ABICreateInstance create_callback;
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (uint32_t idx = 0;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         (create_callback = PluginManager::GetABICreateCallbackAtIndex(idx)) != NULL;
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++idx)
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        abi_sp = create_callback(arch);
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        if (abi_sp)
3475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            return abi_sp;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    abi_sp.reset();
3775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    return abi_sp;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Constructor
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerABI::ABI()
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerABI::~ABI()
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
5437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
5537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonbool
5637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg ClaytonABI::GetRegisterInfoByName (const ConstString &name, RegisterInfo &info)
5737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{
5837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    uint32_t count = 0;
5937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    const RegisterInfo *register_info_array = GetRegisterInfoArray (count);
6037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    if (register_info_array)
6137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    {
6237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        const char *unique_name_cstr = name.GetCString();
6337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        uint32_t i;
6437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        for (i=0; i<count; ++i)
6537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        {
6637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            if (register_info_array[i].name == unique_name_cstr)
6737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            {
6837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                info = register_info_array[i];
6937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                return true;
7037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            }
7137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        }
7237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        for (i=0; i<count; ++i)
7337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        {
7437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            if (register_info_array[i].alt_name == unique_name_cstr)
7537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            {
7637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                info = register_info_array[i];
7737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                return true;
7837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            }
7937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        }
8037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    }
8137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    return false;
8237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton}
8337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
8437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonbool
8537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg ClaytonABI::GetRegisterInfoByKind (RegisterKind reg_kind, uint32_t reg_num, RegisterInfo &info)
8637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{
8737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    if (reg_kind < eRegisterKindGCC || reg_kind >= kNumRegisterKinds)
8837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        return false;
8937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
9037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    uint32_t count = 0;
9137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    const RegisterInfo *register_info_array = GetRegisterInfoArray (count);
9237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    if (register_info_array)
9337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    {
9437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        for (uint32_t i=0; i<count; ++i)
9537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        {
9637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            if (register_info_array[i].kinds[reg_kind] == reg_num)
9737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            {
9837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                info = register_info_array[i];
9937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                return true;
10037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            }
10137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        }
10237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    }
10337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    return false;
10437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton}
1051586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
1061586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamValueObjectSP
1071586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamABI::GetReturnValueObject (Thread &thread,
108f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                           ClangASTType &ast_type,
109f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                           bool persistent) const
1101586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham{
1111586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    if (!ast_type.IsValid())
1121586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        return ValueObjectSP();
1131586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
114016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    ValueObjectSP return_valobj_sp;
115016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
116016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    return_valobj_sp = GetReturnValueObjectImpl(thread, ast_type);
117016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    if (!return_valobj_sp)
118016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        return return_valobj_sp;
119016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
120016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    // Now turn this into a persistent variable.
121016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    // FIXME: This code is duplicated from Target::EvaluateExpression, and it is used in similar form in a couple
122016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    // of other places.  Figure out the correct Create function to do all this work.
123016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
124016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    if (persistent)
1251586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    {
126f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        ClangPersistentVariables& persistent_variables = thread.CalculateTarget()->GetPersistentVariables();
127016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        ConstString persistent_variable_name (persistent_variables.GetNextPersistentVariableName());
128016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
129016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        lldb::ValueObjectSP const_valobj_sp;
130016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
131016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        // Check in case our value is already a constant value
132016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        if (return_valobj_sp->GetIsConstant())
133016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        {
134016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            const_valobj_sp = return_valobj_sp;
135016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            const_valobj_sp->SetName (persistent_variable_name);
136016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        }
137016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        else
138016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            const_valobj_sp = return_valobj_sp->CreateConstantValue (persistent_variable_name);
139016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
140016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        lldb::ValueObjectSP live_valobj_sp = return_valobj_sp;
141016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
142016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        return_valobj_sp = const_valobj_sp;
143016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
144016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        ClangExpressionVariableSP clang_expr_variable_sp(persistent_variables.CreatePersistentVariable(return_valobj_sp));
145016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
146016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        assert (clang_expr_variable_sp.get());
147016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
148016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        // Set flags and live data as appropriate
149016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
150016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        const Value &result_value = live_valobj_sp->GetValue();
151016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
152016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        switch (result_value.GetValueType())
153016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        {
154016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        case Value::eValueTypeHostAddress:
155016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        case Value::eValueTypeFileAddress:
156016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            // we don't do anything with these for now
157016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            break;
158016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        case Value::eValueTypeScalar:
159f0fab4fcabd0aa5a60425b430206d1b5b2bef96fGreg Clayton        case Value::eValueTypeVector:
1609ac3d8b086bbe0413fa85351383072e9ce8b4a60Sean Callanan            clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
161016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
162016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
163016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            break;
164016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        case Value::eValueTypeLoadAddress:
165016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            clang_expr_variable_sp->m_live_sp = live_valobj_sp;
166016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            clang_expr_variable_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
167016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            break;
168016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        }
1699ac3d8b086bbe0413fa85351383072e9ce8b4a60Sean Callanan
170016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        return_valobj_sp = clang_expr_variable_sp->GetValueObject();
1711586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    }
172016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    return return_valobj_sp;
1731586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham}
1741586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
1751586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
176