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